From a050f11c7a8940eee7db0fd8994004e883cf03d1 Mon Sep 17 00:00:00 2001 From: David Oduneye <44040421+DOOduneye@users.noreply.github.com> Date: Thu, 16 May 2024 14:01:00 -0400 Subject: [PATCH 01/28] refactor: new register endpoint, remove user creation endpoint (#808) --- backend/entities/auth/base/controller.go | 34 +++++++++++++ backend/entities/auth/base/routes.go | 8 ++- backend/entities/auth/base/service.go | 44 +++++++++++++++++ backend/entities/auth/base/transactions.go | 11 +++++ backend/entities/users/base/controller.go | 36 -------------- backend/entities/users/base/routes.go | 10 ++-- backend/entities/users/base/service.go | 55 +-------------------- backend/entities/users/base/transactions.go | 11 ----- backend/server/server.go | 10 ++-- backend/utilities/manipulator.go | 6 +++ 10 files changed, 109 insertions(+), 116 deletions(-) diff --git a/backend/entities/auth/base/controller.go b/backend/entities/auth/base/controller.go index 1711e952e..a39ac83e7 100644 --- a/backend/entities/auth/base/controller.go +++ b/backend/entities/auth/base/controller.go @@ -51,6 +51,40 @@ func (a *AuthController) Login(c *fiber.Ctx) error { return c.Status(http.StatusOK).JSON(user) } +// Register godoc +// +// @Summary Registers a user +// @Description Registers a user +// @ID register-user +// @Tags auth +// @Accept json +// @Produce json +// @Param userBody body models.CreateUserRequestBody true "User Body" +// @Success 201 {object} models.User +// @Failure 400 {object} error +// @Failure 404 {object} error +// @Failure 500 {object} error +// @Router /auth/register [post] +func (a *AuthController) Register(c *fiber.Ctx) error { + var userBody models.CreateUserRequestBody + + if err := c.BodyParser(&userBody); err != nil { + return utilities.InvalidJSON() + } + + user, tokens, err := a.authService.Register(userBody) + if err != nil { + return err + } + + err = auth.SetResponseTokens(c, tokens) + if err != nil { + return err + } + + return c.Status(http.StatusCreated).JSON(user) +} + // Refresh godoc // // @Summary Refreshes a user's access token diff --git a/backend/entities/auth/base/routes.go b/backend/entities/auth/base/routes.go index 21f9b28de..b79cbd818 100644 --- a/backend/entities/auth/base/routes.go +++ b/backend/entities/auth/base/routes.go @@ -4,13 +4,13 @@ import ( "github.com/GenerateNU/sac/backend/types" ) -func Auth(params types.RouteParams) AuthServiceInterface { - authService := NewAuthService(params.ServiceParams) - authController := NewAuthController(authService) +func Auth(params types.RouteParams) { + authController := NewAuthController(NewAuthService(params.ServiceParams)) // api/v1/auth/* auth := params.Router.Group("/auth") + auth.Post("/register", authController.Register) auth.Post("/logout", authController.Logout) auth.Post("/login", authController.Login) auth.Post("/refresh", authController.Refresh) @@ -22,6 +22,4 @@ func Auth(params types.RouteParams) AuthServiceInterface { // TODO: rate limit auth.Post("/forgot-password", authController.ForgotPassword) auth.Post("/verify-reset", authController.VerifyPasswordResetToken) - - return authService } diff --git a/backend/entities/auth/base/service.go b/backend/entities/auth/base/service.go index 152ad2fac..44b68a982 100644 --- a/backend/entities/auth/base/service.go +++ b/backend/entities/auth/base/service.go @@ -20,6 +20,7 @@ import ( type AuthServiceInterface interface { GetRole(id string) (*models.UserRole, error) + Register(userBody models.CreateUserRequestBody) (*models.User, *auth.Token, error) Login(userBody models.LoginUserResponseBody) (*models.User, *auth.Token, error) Refresh(refreshToken string) (*auth.Token, error) Logout(c *fiber.Ctx) error @@ -79,6 +80,49 @@ func (a *AuthService) Login(loginBody models.LoginUserResponseBody) (*models.Use return user, tokens, nil } +func (a *AuthService) Register(userBody models.CreateUserRequestBody) (*models.User, *auth.Token, error) { + if err := utilities.Validate(a.Validate, userBody); err != nil { + return nil, nil, err + } + + if err := auth.ValidatePassword(userBody.Password); err != nil { + return nil, nil, err + } + + user, err := utilities.MapRequestToModel(userBody, &models.User{}) + if err != nil { + return nil, nil, err + } + + passwordHash, err := auth.ComputeHash(userBody.Password) + if err != nil { + return nil, nil, err + } + + user.Email = utilities.NormalizeEmail(userBody.Email) + user.PasswordHash = *passwordHash + + if err := a.Integrations.Email.SendWelcomeEmail(fmt.Sprintf("%s %s", user.FirstName, user.LastName), user.Email); err != nil { + return nil, nil, fmt.Errorf("failed to send welcome email: %w", err) + } + + user, err = CreateUser(a.DB, user) + if err != nil { + return nil, nil, err + } + + if err := a.SendCode(user.Email); err != nil { + return nil, nil, err + } + + _, tokens, err := a.Login(models.LoginUserResponseBody{Email: user.Email, Password: userBody.Password}) + if err != nil { + return nil, nil, err + } + + return user, tokens, nil +} + func (a *AuthService) Refresh(refreshToken string) (*auth.Token, error) { claims, err := a.JWT.ExtractClaims(refreshToken, auth.RefreshToken) if err != nil { diff --git a/backend/entities/auth/base/transactions.go b/backend/entities/auth/base/transactions.go index 0f6ff298b..a8812c280 100644 --- a/backend/entities/auth/base/transactions.go +++ b/backend/entities/auth/base/transactions.go @@ -10,6 +10,17 @@ import ( "gorm.io/gorm" ) +func CreateUser(db *gorm.DB, user *models.User) (*models.User, error) { + if err := db.Create(user).Error; err != nil { + if errors.Is(err, gorm.ErrDuplicatedKey) { + return nil, utilities.ErrDuplicate + } + return nil, err + } + + return user, nil +} + func GetToken(db *gorm.DB, token string, tokenType models.VerificationType) (*models.Verification, error) { tokenModel := models.Verification{} if err := db.Where("token = ? AND type = ?", token, tokenType).First(&tokenModel).Error; err != nil { diff --git a/backend/entities/users/base/controller.go b/backend/entities/users/base/controller.go index d39b3b851..da92dcec7 100644 --- a/backend/entities/users/base/controller.go +++ b/backend/entities/users/base/controller.go @@ -19,42 +19,6 @@ func NewUserController(userService UserServiceInterface) *UserController { return &UserController{userService: userService} } -// CreateUser godoc -// -// @Summary Create a user -// @Description Creates a user -// @ID create-user -// @Tags user -// @Accept json -// @Produce json -// @Param userBody body models.CreateUserRequestBody true "User Body" -// @Success 201 {object} models.User -// @Failure 400 {object} error -// @Failure 401 {object} error -// @Failure 404 {object} error -// @Failure 409 {object} error -// @Failure 500 {object} error -// @Router /users/ [post] -func (u *UserController) CreateUser(c *fiber.Ctx) error { - var userBody models.CreateUserRequestBody - - if err := c.BodyParser(&userBody); err != nil { - return utilities.InvalidJSON() - } - - user, tokens, err := u.userService.CreateUser(userBody) - if err != nil { - return err - } - - err = auth.SetResponseTokens(c, tokens) - if err != nil { - return err - } - - return c.Status(http.StatusCreated).JSON(user) -} - // GetUsers godoc // // @Summary Retrieve all users diff --git a/backend/entities/users/base/routes.go b/backend/entities/users/base/routes.go index 9d4263b9a..0ace408b2 100644 --- a/backend/entities/users/base/routes.go +++ b/backend/entities/users/base/routes.go @@ -2,7 +2,6 @@ package base import ( p "github.com/GenerateNU/sac/backend/auth" - authBase "github.com/GenerateNU/sac/backend/entities/auth/base" "github.com/GenerateNU/sac/backend/entities/users/follower" "github.com/GenerateNU/sac/backend/entities/users/member" "github.com/GenerateNU/sac/backend/entities/users/tag" @@ -12,8 +11,8 @@ import ( "github.com/gofiber/fiber/v2" ) -func UserRoutes(userParams types.RouteParams, authService authBase.AuthServiceInterface) { - usersRouter := UsersRouter(userParams, authService) +func UserRoutes(userParams types.RouteParams) { + usersRouter := UsersRouter(userParams) userParams.Router = usersRouter @@ -22,14 +21,13 @@ func UserRoutes(userParams types.RouteParams, authService authBase.AuthServiceIn member.UserMember(userParams) } -func UsersRouter(userParams types.RouteParams, authService authBase.AuthServiceInterface) fiber.Router { - userController := NewUserController(NewUserService(userParams.ServiceParams, authService)) +func UsersRouter(userParams types.RouteParams) fiber.Router { + userController := NewUserController(NewUserService(userParams.ServiceParams)) // api/v1/users/* users := userParams.Router.Group("/users") users.Get("/", userParams.AuthMiddleware.Authorize(p.ReadAll), fiberpaginate.New(), userController.GetUsers) - users.Post("/", userController.CreateUser) users.Get("/me", userParams.AuthMiddleware.Authorize(p.UserRead), userController.GetMe) // api/v1/users/:userID/* diff --git a/backend/entities/users/base/service.go b/backend/entities/users/base/service.go index 6590ae53a..bc7792325 100644 --- a/backend/entities/users/base/service.go +++ b/backend/entities/users/base/service.go @@ -2,11 +2,8 @@ package base import ( "errors" - "fmt" - "strings" "github.com/GenerateNU/sac/backend/auth" - authBase "github.com/GenerateNU/sac/backend/entities/auth/base" "github.com/GenerateNU/sac/backend/entities/models" "github.com/garrettladley/fiberpaginate" @@ -19,7 +16,6 @@ type UserServiceInterface interface { GetUsers(pageInfo fiberpaginate.PageInfo) ([]models.User, error) GetMe(id string) (*models.User, error) GetUser(id string) (*models.User, error) - CreateUser(userBody models.CreateUserRequestBody) (*models.User, *auth.Token, error) UpdateUser(id string, userBody models.UpdateUserRequestBody) (*models.User, error) UpdatePassword(id string, passwordBody models.UpdatePasswordRequestBody) error DeleteUser(id string) error @@ -27,57 +23,10 @@ type UserServiceInterface interface { type UserService struct { types.ServiceParams - AuthService authBase.AuthServiceInterface } -func NewUserService(serviceParams types.ServiceParams, authService authBase.AuthServiceInterface) UserServiceInterface { - return &UserService{ - serviceParams, - authService, - } -} - -func (u *UserService) CreateUser(userBody models.CreateUserRequestBody) (*models.User, *auth.Token, error) { - if err := utilities.Validate(u.Validate, userBody); err != nil { - return nil, nil, err - } - - if err := auth.ValidatePassword(userBody.Password); err != nil { - return nil, nil, err - } - - user, err := utilities.MapRequestToModel(userBody, &models.User{}) - if err != nil { - return nil, nil, err - } - - passwordHash, err := auth.ComputeHash(userBody.Password) - if err != nil { - return nil, nil, err - } - - user.Email = strings.ToLower(userBody.Email) - user.PasswordHash = *passwordHash - - if err := u.Integrations.Email.SendWelcomeEmail(fmt.Sprintf("%s %s", user.FirstName, user.LastName), user.Email); err != nil { - return nil, nil, fmt.Errorf("failed to send welcome email: %w", err) - } - - user, err = CreateUser(u.DB, user) - if err != nil { - return nil, nil, err - } - - if err := u.AuthService.SendCode(user.Email); err != nil { - return nil, nil, err - } - - _, tokens, err := u.AuthService.Login(models.LoginUserResponseBody{Email: user.Email, Password: userBody.Password}) - if err != nil { - return nil, nil, err - } - - return user, tokens, nil +func NewUserService(serviceParams types.ServiceParams) UserServiceInterface { + return &UserService{serviceParams} } func (u *UserService) GetUsers(pageInfo fiberpaginate.PageInfo) ([]models.User, error) { diff --git a/backend/entities/users/base/transactions.go b/backend/entities/users/base/transactions.go index 2b4751671..7cc2a7e58 100644 --- a/backend/entities/users/base/transactions.go +++ b/backend/entities/users/base/transactions.go @@ -12,17 +12,6 @@ import ( "gorm.io/gorm" ) -func CreateUser(db *gorm.DB, user *models.User) (*models.User, error) { - if err := db.Create(user).Error; err != nil { - if errors.Is(err, gorm.ErrDuplicatedKey) { - return nil, utilities.ErrDuplicate - } - return nil, err - } - - return user, nil -} - func GetUsers(db *gorm.DB, pageInfo fiberpaginate.PageInfo) ([]models.User, error) { var users []models.User if err := db.Omit("password_hash").Scopes(utilities.IntoScope(pageInfo, db)).Find(&users).Error; err != nil { diff --git a/backend/server/server.go b/backend/server/server.go index d339b99b2..b5e6fd3cb 100644 --- a/backend/server/server.go +++ b/backend/server/server.go @@ -5,9 +5,9 @@ import ( go_json "github.com/goccy/go-json" - "github.com/GenerateNU/sac/backend/auth" + authenticator "github.com/GenerateNU/sac/backend/auth" "github.com/GenerateNU/sac/backend/config" - authBase "github.com/GenerateNU/sac/backend/entities/auth/base" + auth "github.com/GenerateNU/sac/backend/entities/auth/base" categories "github.com/GenerateNU/sac/backend/entities/categories/base" clubs "github.com/GenerateNU/sac/backend/entities/clubs/base" contacts "github.com/GenerateNU/sac/backend/entities/contacts/base" @@ -48,7 +48,7 @@ func Init(db *gorm.DB, integrations integrations.Integrations, settings config.S panic(fmt.Sprintf("Error registering custom validators: %s", err)) } - jwt := auth.NewJWTClient(settings.Auth, jwt.SigningMethodHS256) + jwt := authenticator.NewJWTClient(settings.Auth, jwt.SigningMethodHS256) authMiddleware := middleware.NewAuthMiddlewareService(db, validate, settings.Auth) apiv1 := app.Group("/api/v1") @@ -72,8 +72,8 @@ func Init(db *gorm.DB, integrations integrations.Integrations, settings config.S func allRoutes(app *fiber.App, routeParams types.RouteParams) { Utility(app) - authService := authBase.Auth(routeParams) - users.UserRoutes(routeParams, authService) + auth.Auth(routeParams) + users.UserRoutes(routeParams) clubs.ClubRoutes(routeParams) contacts.Contact(routeParams) pocs.PointOfContact(routeParams) diff --git a/backend/utilities/manipulator.go b/backend/utilities/manipulator.go index ff0a1d791..36061050f 100644 --- a/backend/utilities/manipulator.go +++ b/backend/utilities/manipulator.go @@ -1,6 +1,8 @@ package utilities import ( + "strings" + "github.com/mitchellh/mapstructure" ) @@ -23,3 +25,7 @@ func MapRequestToModel[T any, U any](responseData T, targetModel *U) (*U, error) return targetModel, nil } + +func NormalizeEmail(email string) string { + return strings.ToLower(email) +} From 991e82988ee86584d20e50ad14a3fb825851a329 Mon Sep 17 00:00:00 2001 From: Garrett Ladley <92384606+garrettladley@users.noreply.github.com> Date: Thu, 16 May 2024 21:38:14 -0400 Subject: [PATCH 02/28] backend: bump to fiberpaginate v1.0.1 (#809) --- backend/go.mod | 2 +- backend/go.sum | 4 ++-- backend/utilities/pagination.go | 2 +- go.work.sum | 4 ++-- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/backend/go.mod b/backend/go.mod index 1dc31bb77..c0c5d0e2c 100644 --- a/backend/go.mod +++ b/backend/go.mod @@ -6,7 +6,7 @@ require ( github.com/a-h/templ v0.2.680 github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5 github.com/aws/aws-sdk-go v1.53.0 - github.com/garrettladley/fiberpaginate v0.1.1 + github.com/garrettladley/fiberpaginate v1.0.1 github.com/garrettladley/mattress v0.4.0 github.com/go-playground/validator/v10 v10.20.0 github.com/goccy/go-json v0.10.2 diff --git a/backend/go.sum b/backend/go.sum index ceab7a000..65b25dc8b 100644 --- a/backend/go.sum +++ b/backend/go.sum @@ -36,8 +36,8 @@ github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nos github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= github.com/gabriel-vasile/mimetype v1.4.3 h1:in2uUcidCuFcDKtdcBxlR0rJ1+fsokWf+uqxgUFjbI0= github.com/gabriel-vasile/mimetype v1.4.3/go.mod h1:d8uq/6HKRL6CGdk+aubisF/M5GcPfT7nKyLpA0lbSSk= -github.com/garrettladley/fiberpaginate v0.1.1 h1:YqDZQ8rM7wpbdqFqjqS1Bc1JC1qy4QPpI/vw8PYSQDQ= -github.com/garrettladley/fiberpaginate v0.1.1/go.mod h1:MHVWGQkhtnt2kE8F0wkTF5iUQOyqZlRktfcGgBLRBv0= +github.com/garrettladley/fiberpaginate v1.0.1 h1:Ren6wx8L8KLcPvCKUkgRuaZaxX7CjCCoPhCUytnrGyk= +github.com/garrettladley/fiberpaginate v1.0.1/go.mod h1:MHVWGQkhtnt2kE8F0wkTF5iUQOyqZlRktfcGgBLRBv0= github.com/garrettladley/mattress v0.4.0 h1:ZB3iqyc5q6bqIryNfsh2FMcbMdnV1XEryvqivouceQE= github.com/garrettladley/mattress v0.4.0/go.mod h1:OWKIRc9wC3gtD3Ng/nUuNEiR1TJvRYLmn/KZYw9nl5Q= github.com/go-openapi/jsonpointer v0.21.0 h1:YgdVicSA9vH5RiHs9TZW5oyafXZFc6+2Vc1rr/O9oNQ= diff --git a/backend/utilities/pagination.go b/backend/utilities/pagination.go index 0c25fca79..462d412db 100644 --- a/backend/utilities/pagination.go +++ b/backend/utilities/pagination.go @@ -7,6 +7,6 @@ import ( func IntoScope(p fiberpaginate.PageInfo, db *gorm.DB) func(db *gorm.DB) *gorm.DB { return func(db *gorm.DB) *gorm.DB { - return db.Offset(p.Offset()).Limit(p.Limit) + return db.Offset(p.Start()).Limit(p.Limit) } } diff --git a/go.work.sum b/go.work.sum index 4eae0e205..989b274a0 100644 --- a/go.work.sum +++ b/go.work.sum @@ -198,8 +198,8 @@ github.com/form3tech-oss/jwt-go v3.2.5+incompatible/go.mod h1:pbq4aXjuKjdthFRnoD github.com/fsouza/fake-gcs-server v1.17.0/go.mod h1:D1rTE4YCyHFNa99oyJJ5HyclvN/0uQR+pM/VdlL83bw= github.com/gabriel-vasile/mimetype v1.4.2 h1:w5qFW6JKBz9Y393Y4q372O9A7cUSequkh1Q7OhCmWKU= github.com/gabriel-vasile/mimetype v1.4.2/go.mod h1:zApsH/mKG4w07erKIaJPFiX0Tsq9BFQgN3qGY5GnNgA= -github.com/garrettladley/fiberpaginate v0.1.1 h1:YqDZQ8rM7wpbdqFqjqS1Bc1JC1qy4QPpI/vw8PYSQDQ= -github.com/garrettladley/fiberpaginate v0.1.1/go.mod h1:MHVWGQkhtnt2kE8F0wkTF5iUQOyqZlRktfcGgBLRBv0= +github.com/garrettladley/fiberpaginate v1.0.1 h1:Ren6wx8L8KLcPvCKUkgRuaZaxX7CjCCoPhCUytnrGyk= +github.com/garrettladley/fiberpaginate v1.0.1/go.mod h1:MHVWGQkhtnt2kE8F0wkTF5iUQOyqZlRktfcGgBLRBv0= github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/gobuffalo/here v0.6.0/go.mod h1:wAG085dHOYqUpf+Ap+WOdrPTp5IYcDAs/x7PLa8Y5fM= From 3805572c39957bdc52a0e33f0d14ec1682fddcfa Mon Sep 17 00:00:00 2001 From: Mai Nguyen <123816878+in-mai-space@users.noreply.github.com> Date: Fri, 17 May 2024 08:39:21 +0700 Subject: [PATCH 03/28] feat: dashboard state management (#806) Co-authored-by: Garrett Ladley <92384606+garrettladley@users.noreply.github.com> --- cli/go.sum | 8 + frontend/dashboard/components/ui/button.tsx | 56 - frontend/dashboard/package.json | 10 +- frontend/dashboard/src/app/page.tsx | 1 - .../dashboard/src/app/state/club/clubSlice.ts | 39 + .../app/state/recruitment/recruitmentSlice.ts | 29 + .../dashboard/src/app/tests/clubState.test.ts | 82 + .../src/app/tests/recruitmentState.test.ts | 60 + frontend/dashboard/src/store/store.ts | 5 +- frontend/dashboard/src/types/application.ts | 4 + frontend/dashboard/src/types/club.ts | 31 + frontend/dashboard/src/types/recruitment.ts | 29 + frontend/dashboard/yarn.lock | 1935 +++++++++-------- 13 files changed, 1281 insertions(+), 1008 deletions(-) delete mode 100644 frontend/dashboard/components/ui/button.tsx create mode 100644 frontend/dashboard/src/app/state/club/clubSlice.ts create mode 100644 frontend/dashboard/src/app/state/recruitment/recruitmentSlice.ts create mode 100644 frontend/dashboard/src/app/tests/clubState.test.ts create mode 100644 frontend/dashboard/src/app/tests/recruitmentState.test.ts create mode 100644 frontend/dashboard/src/types/application.ts create mode 100644 frontend/dashboard/src/types/club.ts create mode 100644 frontend/dashboard/src/types/recruitment.ts diff --git a/cli/go.sum b/cli/go.sum index 4b308a3ce..b1cae943d 100644 --- a/cli/go.sum +++ b/cli/go.sum @@ -16,14 +16,18 @@ github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyT github.com/garrettladley/mattress v0.4.0 h1:ZB3iqyc5q6bqIryNfsh2FMcbMdnV1XEryvqivouceQE= github.com/garrettladley/mattress v0.4.0/go.mod h1:OWKIRc9wC3gtD3Ng/nUuNEiR1TJvRYLmn/KZYw9nl5Q= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= @@ -70,13 +74,17 @@ github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSW go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI= +golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= golang.org/x/exp v0.0.0-20240404231335-c0f41cb1a7a0 h1:985EYyeCOxTpcgOTJpflJUwOeEz0CQOdPt73OzpE9F8= golang.org/x/exp v0.0.0-20240404231335-c0f41cb1a7a0/go.mod h1:/lliqkxwWAhPjf5oSOIJup2XcqJaw8RGS6k3TGEc7GI= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= +golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= +golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/frontend/dashboard/components/ui/button.tsx b/frontend/dashboard/components/ui/button.tsx deleted file mode 100644 index 0ba427735..000000000 --- a/frontend/dashboard/components/ui/button.tsx +++ /dev/null @@ -1,56 +0,0 @@ -import * as React from "react" -import { Slot } from "@radix-ui/react-slot" -import { cva, type VariantProps } from "class-variance-authority" - -import { cn } from "@/lib/utils" - -const buttonVariants = cva( - "inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50", - { - variants: { - variant: { - default: "bg-primary text-primary-foreground hover:bg-primary/90", - destructive: - "bg-destructive text-destructive-foreground hover:bg-destructive/90", - outline: - "border border-input bg-background hover:bg-accent hover:text-accent-foreground", - secondary: - "bg-secondary text-secondary-foreground hover:bg-secondary/80", - ghost: "hover:bg-accent hover:text-accent-foreground", - link: "text-primary underline-offset-4 hover:underline", - }, - size: { - default: "h-10 px-4 py-2", - sm: "h-9 rounded-md px-3", - lg: "h-11 rounded-md px-8", - icon: "h-10 w-10", - }, - }, - defaultVariants: { - variant: "default", - size: "default", - }, - } -) - -export interface ButtonProps - extends React.ButtonHTMLAttributes, - VariantProps { - asChild?: boolean -} - -const Button = React.forwardRef( - ({ className, variant, size, asChild = false, ...props }, ref) => { - const Comp = asChild ? Slot : "button" - return ( - - ) - } -) -Button.displayName = "Button" - -export { Button, buttonVariants } diff --git a/frontend/dashboard/package.json b/frontend/dashboard/package.json index ff71b9db3..a7cb2c850 100644 --- a/frontend/dashboard/package.json +++ b/frontend/dashboard/package.json @@ -8,7 +8,7 @@ "start": "next start", "lint": "next lint", "format": "prettier --write .", - "test": "echo \"Woah there, we have no frontend tests as of right now. Let's just say we're passing.\" && exit 0" + "test": "jest" }, "dependencies": { "@generatesac/lib": "^0.0.1", @@ -25,8 +25,13 @@ "tailwindcss-animate": "^1.0.7", "zod": "^3.23.8" }, + "jest": { + "preset": "ts-jest", + "testEnvironment": "node" + }, "devDependencies": { "@trivago/prettier-plugin-sort-imports": "^4.3.0", + "@types/jest": "^29.5.12", "@types/node": "^20", "@types/react": "^18", "@types/react-dom": "^18", @@ -34,10 +39,11 @@ "eslint": "^8", "eslint-config-next": "14.2.3", "eslint-plugin-prettier": "^5.1.3", - "jest": "^29.2.1", + "jest": "^29.7.0", "postcss": "^8", "prettier": "^3.2.4", "tailwindcss": "^3.4.1", + "ts-jest": "^29.1.2", "typescript": "5.4.5" } } diff --git a/frontend/dashboard/src/app/page.tsx b/frontend/dashboard/src/app/page.tsx index 8e11dc1ed..c26fb593c 100644 --- a/frontend/dashboard/src/app/page.tsx +++ b/frontend/dashboard/src/app/page.tsx @@ -37,7 +37,6 @@ export default function Home() { priority /> -
) { + return produce(state, draft => { + Object.assign(draft, action.payload); + }); + }, + updateClub(state, action: PayloadAction) { + return produce(state, draft => { + Object.assign(draft, action.payload); + }); + }, + resetClub() { + return initialState; + } + } +}) + +export const { setClub, updateClub, resetClub } = clubSlice.actions; +export const clubReducer = clubSlice.reducer; \ No newline at end of file diff --git a/frontend/dashboard/src/app/state/recruitment/recruitmentSlice.ts b/frontend/dashboard/src/app/state/recruitment/recruitmentSlice.ts new file mode 100644 index 000000000..c2fcce6f9 --- /dev/null +++ b/frontend/dashboard/src/app/state/recruitment/recruitmentSlice.ts @@ -0,0 +1,29 @@ +import { createSlice, PayloadAction } from '@reduxjs/toolkit'; +import { Recruitment, RecruitmentCycle } from '../../../types/recruitment'; + + +const initialState: Recruitment = { + recruitmentCycle: RecruitmentCycle.Always, + recruitmentType: [], + isRecruiting: false, + applications: [] +}; + +const recruitmentSlice = createSlice({ + name: 'recruitment', + initialState, + reducers: { + setRecruitment(_, action: PayloadAction) { + return action.payload; + }, + updateRecruitment(state, action: PayloadAction>) { + return { ...state, ...action.payload }; + }, + resetRecruitment() { + return initialState; + } + } +}); + +export const { setRecruitment, updateRecruitment, resetRecruitment } = recruitmentSlice.actions; +export const recruitmentReducer = recruitmentSlice.reducer; \ No newline at end of file diff --git a/frontend/dashboard/src/app/tests/clubState.test.ts b/frontend/dashboard/src/app/tests/clubState.test.ts new file mode 100644 index 000000000..0a5e8fd24 --- /dev/null +++ b/frontend/dashboard/src/app/tests/clubState.test.ts @@ -0,0 +1,82 @@ +import { setClub, updateClub, resetClub, clubReducer } from '../state/club/clubSlice'; +import { Club, CreateClubRequestBody, UpdateClubRequestBody } from '../../types/club'; + +describe('club slice', () => { + const initialState: Club = { + userId: '', + clubId: '', + clubName: '', + accessToken: '', + csrfToken: '', + preview: '', + description: '', + weeklyTimeCommitment: 0, + oneWordToDescribeUs: '', + logo: '', + } + + it('set club', () => { + const club: CreateClubRequestBody = { + userId: '123', + name: 'Generate', + preview: 'preview', + description: 'description', + weeklyTimeCommitment: 10, + oneWordToDescribeUs: 'innovative', + logo: 'logo.png', + } + + const action = setClub(club); + const nextState = clubReducer(initialState, action); + expect(nextState).toEqual({ + ...initialState, + ...club + }) + }) + + it('update club', () => { + const currentState: Club = { + userId: '123', + clubId: '456', + clubName: 'Generate Development Studio', + accessToken: 'token', + csrfToken: 'csrf', + preview: 'preview', + description: 'description', + weeklyTimeCommitment: 20, + oneWordToDescribeUs: 'daring', + logo: 'logo.png', + } + + const updatedFields: UpdateClubRequestBody = { + preview: 'new preview', + weeklyTimeCommitment: 10, + } + + const action = updateClub(updatedFields); + const nextState = clubReducer(currentState, action); + expect(nextState).toEqual({ + ...currentState, + ...updatedFields, + }) + }) + + it('reset club', () => { + const currentState: Club = { + userId: '123', + clubId: '456', + clubName: 'Generate Development Studio', + accessToken: 'token', + csrfToken: 'csrf', + preview: 'preview', + description: 'description', + weeklyTimeCommitment: 20, + oneWordToDescribeUs: 'daring', + logo: 'logo.png', + } + + const action = resetClub(); + const nextState = clubReducer(currentState, action); + expect(nextState).toEqual(initialState); + }) +}) \ No newline at end of file diff --git a/frontend/dashboard/src/app/tests/recruitmentState.test.ts b/frontend/dashboard/src/app/tests/recruitmentState.test.ts new file mode 100644 index 000000000..89c21ccaa --- /dev/null +++ b/frontend/dashboard/src/app/tests/recruitmentState.test.ts @@ -0,0 +1,60 @@ +import { setRecruitment, updateRecruitment, resetRecruitment, recruitmentReducer } from '../state/recruitment/recruitmentSlice'; +import { Recruitment, RecruitmentCycle, RecruitmentType, UpdateRecruitmentRequestBody } from '../../types/recruitment'; + +describe('recruitment slice', () => { + const initialState: Recruitment = { + recruitmentCycle: RecruitmentCycle.Always, + recruitmentType: [], + isRecruiting: false, + applications: [] + } + + it('set recruitment', () => { + const recruitment: Recruitment = { + recruitmentCycle: RecruitmentCycle.Spring, + recruitmentType: [RecruitmentType.Apply], + isRecruiting: true, + applications: [] + } + + const action = setRecruitment(recruitment); + const nextState = recruitmentReducer(initialState, action); + expect(nextState).toEqual({ + ...initialState, + ...recruitment + }); + }) + + it('update recruitment', () => { + const currentState: Recruitment = { + recruitmentCycle: RecruitmentCycle.Spring, + recruitmentType: [RecruitmentType.Apply], + isRecruiting: true, + applications: [] + } + + const updatedFields: UpdateRecruitmentRequestBody = { + isRecruiting: false, + } + + const action = updateRecruitment(updatedFields); + const nextState = recruitmentReducer(currentState, action); + expect(nextState).toEqual({ + ...currentState, + ...updatedFields, + }) + }) + + it('reset recruitment', () => { + const currentState: Recruitment = { + recruitmentCycle: RecruitmentCycle.Spring, + recruitmentType: [RecruitmentType.Apply], + isRecruiting: true, + applications: [] + } + + const action = resetRecruitment(); + const nextState = recruitmentReducer(currentState, action); + expect(nextState).toEqual(initialState); + }); +}) \ No newline at end of file diff --git a/frontend/dashboard/src/store/store.ts b/frontend/dashboard/src/store/store.ts index 10d491296..7e5a536ec 100644 --- a/frontend/dashboard/src/store/store.ts +++ b/frontend/dashboard/src/store/store.ts @@ -1,13 +1,16 @@ import { baseApi } from '@generatesac/lib'; import { configureStore } from '@reduxjs/toolkit' import { useDispatch, useSelector, useStore } from 'react-redux'; +import { clubReducer } from '../app/state/club/clubSlice'; +import { recruitmentReducer } from '../app/state/recruitment/recruitmentSlice'; export const makeStore = () => { return configureStore({ reducer: { [baseApi.reducerPath]: baseApi.reducer, + clubReducer: clubReducer, + recruitmentReducer: recruitmentReducer, }, - middleware: (getDefaultMiddleware) => getDefaultMiddleware() .concat(baseApi.middleware) diff --git a/frontend/dashboard/src/types/application.ts b/frontend/dashboard/src/types/application.ts new file mode 100644 index 000000000..50356a079 --- /dev/null +++ b/frontend/dashboard/src/types/application.ts @@ -0,0 +1,4 @@ +export type Application = { + applicationTitle: string + applicationLink: string +} \ No newline at end of file diff --git a/frontend/dashboard/src/types/club.ts b/frontend/dashboard/src/types/club.ts new file mode 100644 index 000000000..b1bb49503 --- /dev/null +++ b/frontend/dashboard/src/types/club.ts @@ -0,0 +1,31 @@ +export type Club = { + userId: string; + clubId: string; + parentId?: string; + clubName: string; + accessToken: string; + csrfToken: string; + preview: string; + description: string; + weeklyTimeCommitment: number; + oneWordToDescribeUs: string; + logo: string; +} + +export interface CreateClubRequestBody { + userId: string; + name: string; + preview: string; + description: string; + weeklyTimeCommitment: number; + oneWordToDescribeUs: string; + logo: string; +} + +export interface UpdateClubRequestBody { + preview?: string; + description?: string; + weeklyTimeCommitment?: number; + oneWordToDescribeUs?: string; + logo?: string; +} \ No newline at end of file diff --git a/frontend/dashboard/src/types/recruitment.ts b/frontend/dashboard/src/types/recruitment.ts new file mode 100644 index 000000000..9f7e72fc0 --- /dev/null +++ b/frontend/dashboard/src/types/recruitment.ts @@ -0,0 +1,29 @@ +import { Application } from "./application"; + +export enum RecruitmentCycle { + Fall = 'fall', + FallSpring = 'fallSpring', + Spring = 'spring', + Always = 'always' +} + +export enum RecruitmentType { + Unrestricted = 'unrestricted', + Tryout = 'tryout', + Apply = 'application' +} + +export type Recruitment = { + recruitmentCycle: RecruitmentCycle; + recruitmentType: RecruitmentType[]; + isRecruiting: boolean; + applications: Application[]; +} + +export type UpdateRecruitmentRequestBody = { + recruitmentCycle?: RecruitmentCycle; + recruitmentType?: RecruitmentType[]; + isRecruiting?: boolean; + applications?: Application[]; +} + diff --git a/frontend/dashboard/yarn.lock b/frontend/dashboard/yarn.lock index fe60f1ac8..5845753cf 100644 --- a/frontend/dashboard/yarn.lock +++ b/frontend/dashboard/yarn.lock @@ -4,12 +4,12 @@ "@alloc/quick-lru@^5.2.0": version "5.2.0" - resolved "https://registry.yarnpkg.com/@alloc/quick-lru/-/quick-lru-5.2.0.tgz#7bf68b20c0a350f936915fcae06f58e32007ce30" + resolved "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz" integrity sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw== "@ampproject/remapping@^2.2.0": version "2.3.0" - resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.3.0.tgz#ed441b6fa600072520ce18b43d2c8cc8caecc7f4" + resolved "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz" integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw== dependencies: "@jridgewell/gen-mapping" "^0.3.5" @@ -17,7 +17,7 @@ "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.22.13", "@babel/code-frame@^7.23.5", "@babel/code-frame@^7.24.2": version "7.24.2" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.24.2.tgz#718b4b19841809a58b29b68cde80bc5e1aa6d9ae" + resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz" integrity sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ== dependencies: "@babel/highlight" "^7.24.2" @@ -25,12 +25,12 @@ "@babel/compat-data@^7.23.5": version "7.24.4" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.24.4.tgz#6f102372e9094f25d908ca0d34fc74c74606059a" + resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.4.tgz" integrity sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ== -"@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.23.9": +"@babel/core@^7.0.0", "@babel/core@^7.0.0-0", "@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.23.9", "@babel/core@^7.8.0", "@babel/core@>=7.0.0-beta.0 <8": version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.24.5.tgz#15ab5b98e101972d171aeef92ac70d8d6718f06a" + resolved "https://registry.npmjs.org/@babel/core/-/core-7.24.5.tgz" integrity sha512-tVQRucExLQ02Boi4vdPp49svNGcfL2GhdTCT9aldhXgCJVAI21EtRfBettiuLUwce/7r6bFdgs6JFkcdTiFttA== dependencies: "@ampproject/remapping" "^2.2.0" @@ -49,18 +49,19 @@ json5 "^2.2.3" semver "^6.3.1" -"@babel/generator@7.17.7": - version "7.17.7" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.17.7.tgz#8da2599beb4a86194a3b24df6c085931d9ee45ad" - integrity sha512-oLcVCTeIFadUoArDTwpluncplrYBmTCCZZgXCbgNGvOBBiSDDK3eWO4b/+eOTli5tKv1lg+a5/NAXg+nTcei1w== +"@babel/generator@^7.23.0": + version "7.24.5" + resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.24.5.tgz" + integrity sha512-x32i4hEXvr+iI0NEoEfDKzlemF8AmtOP8CcrRaEcpzysWuoEb1KknpcvMsHKPONoKZiDuItklgWhB18xEhr9PA== dependencies: - "@babel/types" "^7.17.0" + "@babel/types" "^7.24.5" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.25" jsesc "^2.5.1" - source-map "^0.5.0" -"@babel/generator@^7.23.0", "@babel/generator@^7.24.5", "@babel/generator@^7.7.2": +"@babel/generator@^7.24.5", "@babel/generator@^7.7.2": version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.24.5.tgz#e5afc068f932f05616b66713e28d0f04e99daeb3" + resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.24.5.tgz" integrity sha512-x32i4hEXvr+iI0NEoEfDKzlemF8AmtOP8CcrRaEcpzysWuoEb1KknpcvMsHKPONoKZiDuItklgWhB18xEhr9PA== dependencies: "@babel/types" "^7.24.5" @@ -68,9 +69,18 @@ "@jridgewell/trace-mapping" "^0.3.25" jsesc "^2.5.1" +"@babel/generator@7.17.7": + version "7.17.7" + resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.17.7.tgz" + integrity sha512-oLcVCTeIFadUoArDTwpluncplrYBmTCCZZgXCbgNGvOBBiSDDK3eWO4b/+eOTli5tKv1lg+a5/NAXg+nTcei1w== + dependencies: + "@babel/types" "^7.17.0" + jsesc "^2.5.1" + source-map "^0.5.0" + "@babel/helper-compilation-targets@^7.23.6": version "7.23.6" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz#4d79069b16cbcf1461289eccfbbd81501ae39991" + resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz" integrity sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ== dependencies: "@babel/compat-data" "^7.23.5" @@ -81,12 +91,12 @@ "@babel/helper-environment-visitor@^7.22.20": version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167" + resolved "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz" integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== "@babel/helper-function-name@^7.23.0": version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz#1f9a3cdbd5b2698a670c30d2735f9af95ed52759" + resolved "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz" integrity sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw== dependencies: "@babel/template" "^7.22.15" @@ -94,21 +104,21 @@ "@babel/helper-hoist-variables@^7.22.5": version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb" + resolved "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz" integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== dependencies: "@babel/types" "^7.22.5" "@babel/helper-module-imports@^7.24.3": version "7.24.3" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz#6ac476e6d168c7c23ff3ba3cf4f7841d46ac8128" + resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz" integrity sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg== dependencies: "@babel/types" "^7.24.0" "@babel/helper-module-transforms@^7.24.5": version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.24.5.tgz#ea6c5e33f7b262a0ae762fd5986355c45f54a545" + resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.5.tgz" integrity sha512-9GxeY8c2d2mdQUP1Dye0ks3VDyIMS98kt/llQ2nUId8IsWqTF0l1LkSX0/uP7l7MCDrzXS009Hyhe2gzTiGW8A== dependencies: "@babel/helper-environment-visitor" "^7.22.20" @@ -119,41 +129,41 @@ "@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.24.0", "@babel/helper-plugin-utils@^7.8.0": version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.5.tgz#a924607dd254a65695e5bd209b98b902b3b2f11a" + resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.5.tgz" integrity sha512-xjNLDopRzW2o6ba0gKbkZq5YWEBaK3PCyTOY1K2P/O07LGMhMqlMXPxwN4S5/RhWuCobT8z0jrlKGlYmeR1OhQ== "@babel/helper-simple-access@^7.24.5": version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.24.5.tgz#50da5b72f58c16b07fbd992810be6049478e85ba" + resolved "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.5.tgz" integrity sha512-uH3Hmf5q5n7n8mz7arjUlDOCbttY/DW4DYhE6FUsjKJ/oYC1kQQUvwEQWxRwUpX9qQKRXeqLwWxrqilMrf32sQ== dependencies: "@babel/types" "^7.24.5" "@babel/helper-split-export-declaration@^7.22.6", "@babel/helper-split-export-declaration@^7.24.5": version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.5.tgz#b9a67f06a46b0b339323617c8c6213b9055a78b6" + resolved "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.5.tgz" integrity sha512-5CHncttXohrHk8GWOFCcCl4oRD9fKosWlIRgWm4ql9VYioKm52Mk2xsmoohvm7f3JoiLSM5ZgJuRaf5QZZYd3Q== dependencies: "@babel/types" "^7.24.5" "@babel/helper-string-parser@^7.24.1": version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz#f99c36d3593db9540705d0739a1f10b5e20c696e" + resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz" integrity sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ== "@babel/helper-validator-identifier@^7.16.7", "@babel/helper-validator-identifier@^7.24.5": version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.5.tgz#918b1a7fa23056603506370089bd990d8720db62" + resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.5.tgz" integrity sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA== "@babel/helper-validator-option@^7.23.5": version "7.23.5" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz#907a3fbd4523426285365d1206c423c4c5520307" + resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz" integrity sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw== "@babel/helpers@^7.24.5": version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.24.5.tgz#fedeb87eeafa62b621160402181ad8585a22a40a" + resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.5.tgz" integrity sha512-CiQmBMMpMQHwM5m01YnrM6imUG1ebgYJ+fAIW4FZe6m4qHTPaRHti+R8cggAwkdz4oXhtO4/K9JWlh+8hIfR2Q== dependencies: "@babel/template" "^7.24.0" @@ -162,7 +172,7 @@ "@babel/highlight@^7.24.2": version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.5.tgz#bc0613f98e1dd0720e99b2a9ee3760194a704b6e" + resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.5.tgz" integrity sha512-8lLmua6AVh/8SLJRRVD6V8p73Hir9w5mJrhE+IPpILG31KKlI9iz5zmBYKcWPS59qSfgP9RaSBQSHHE81WKuEw== dependencies: "@babel/helper-validator-identifier" "^7.24.5" @@ -172,126 +182,142 @@ "@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.5", "@babel/parser@^7.20.7", "@babel/parser@^7.23.0", "@babel/parser@^7.23.9", "@babel/parser@^7.24.0", "@babel/parser@^7.24.5": version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.5.tgz#4a4d5ab4315579e5398a82dcf636ca80c3392790" + resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.24.5.tgz" integrity sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg== "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz" integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-bigint@^7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz#4c9a6f669f5d0cdf1b90a1671e9a146be5300cea" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz" integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-class-properties@^7.8.3": version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz" integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== dependencies: "@babel/helper-plugin-utils" "^7.12.13" "@babel/plugin-syntax-import-meta@^7.8.3": version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz" integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== dependencies: "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-json-strings@^7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz" integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-jsx@^7.7.2": version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.1.tgz#3f6ca04b8c841811dbc3c5c5f837934e0d626c10" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.1.tgz" integrity sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA== dependencies: "@babel/helper-plugin-utils" "^7.24.0" "@babel/plugin-syntax-logical-assignment-operators@^7.8.3": version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz" integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== dependencies: "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz" integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-numeric-separator@^7.8.3": version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz" integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== dependencies: "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-object-rest-spread@^7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz" integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-optional-catch-binding@^7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz" integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-optional-chaining@^7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz" integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-top-level-await@^7.8.3": version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz" integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== dependencies: "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-typescript@^7.7.2": version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.1.tgz#b3bcc51f396d15f3591683f90239de143c076844" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.1.tgz" integrity sha512-Yhnmvy5HZEnHUty6i++gcfH1/l68AHnItFHnaCv6hn9dNh0hQvvQJsxpi4BMBFN5DLeHBuucT/0DgzXif/OyRw== dependencies: "@babel/helper-plugin-utils" "^7.24.0" "@babel/runtime@^7.13.10", "@babel/runtime@^7.20.13", "@babel/runtime@^7.23.2", "@babel/runtime@^7.24.1": version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.5.tgz#230946857c053a36ccc66e1dd03b17dd0c4ed02c" + resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.5.tgz" integrity sha512-Nms86NXrsaeU9vbBJKni6gXiEXZ4CVpYVzEjDH9Sb8vmZ3UljyA1GSOJl/6LGPO8EHLuSF9H+IxNXHPX8QHJ4g== dependencies: regenerator-runtime "^0.14.0" "@babel/template@^7.22.15", "@babel/template@^7.24.0", "@babel/template@^7.3.3": version "7.24.0" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.24.0.tgz#c6a524aa93a4a05d66aaf31654258fae69d87d50" + resolved "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz" integrity sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA== dependencies: "@babel/code-frame" "^7.23.5" "@babel/parser" "^7.24.0" "@babel/types" "^7.24.0" +"@babel/traverse@^7.24.5": + version "7.24.5" + resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.5.tgz" + integrity sha512-7aaBLeDQ4zYcUFDUD41lJc1fG8+5IU9DaNSJAgal866FGvmD5EbWQgnEC6kO1gGLsX0esNkfnJSndbTXA3r7UA== + dependencies: + "@babel/code-frame" "^7.24.2" + "@babel/generator" "^7.24.5" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-function-name" "^7.23.0" + "@babel/helper-hoist-variables" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.24.5" + "@babel/parser" "^7.24.5" + "@babel/types" "^7.24.5" + debug "^4.3.1" + globals "^11.1.0" + "@babel/traverse@7.23.2": version "7.23.2" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.2.tgz#329c7a06735e144a506bdb2cad0268b7f46f4ad8" + resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz" integrity sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw== dependencies: "@babel/code-frame" "^7.22.13" @@ -305,47 +331,40 @@ debug "^4.1.0" globals "^11.1.0" -"@babel/traverse@^7.24.5": +"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.24.0", "@babel/types@^7.24.5", "@babel/types@^7.3.3": version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.24.5.tgz#972aa0bc45f16983bf64aa1f877b2dd0eea7e6f8" - integrity sha512-7aaBLeDQ4zYcUFDUD41lJc1fG8+5IU9DaNSJAgal866FGvmD5EbWQgnEC6kO1gGLsX0esNkfnJSndbTXA3r7UA== - dependencies: - "@babel/code-frame" "^7.24.2" - "@babel/generator" "^7.24.5" - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-function-name" "^7.23.0" - "@babel/helper-hoist-variables" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.24.5" - "@babel/parser" "^7.24.5" - "@babel/types" "^7.24.5" - debug "^4.3.1" - globals "^11.1.0" - -"@babel/types@7.17.0": - version "7.17.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.17.0.tgz#a826e368bccb6b3d84acd76acad5c0d87342390b" - integrity sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw== + resolved "https://registry.npmjs.org/@babel/types/-/types-7.24.5.tgz" + integrity sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ== dependencies: - "@babel/helper-validator-identifier" "^7.16.7" + "@babel/helper-string-parser" "^7.24.1" + "@babel/helper-validator-identifier" "^7.24.5" to-fast-properties "^2.0.0" -"@babel/types@^7.0.0", "@babel/types@^7.17.0", "@babel/types@^7.20.7", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.24.0", "@babel/types@^7.24.5", "@babel/types@^7.3.3": +"@babel/types@^7.17.0": version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.24.5.tgz#7661930afc638a5383eb0c4aee59b74f38db84d7" + resolved "https://registry.npmjs.org/@babel/types/-/types-7.24.5.tgz" integrity sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ== dependencies: "@babel/helper-string-parser" "^7.24.1" "@babel/helper-validator-identifier" "^7.24.5" to-fast-properties "^2.0.0" +"@babel/types@7.17.0": + version "7.17.0" + resolved "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz" + integrity sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw== + dependencies: + "@babel/helper-validator-identifier" "^7.16.7" + to-fast-properties "^2.0.0" + "@bcoe/v8-coverage@^0.2.3": version "0.2.3" - resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" + resolved "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== "@blocknote/core@^0.12.4": version "0.12.4" - resolved "https://registry.yarnpkg.com/@blocknote/core/-/core-0.12.4.tgz#339e01a7a7b34caab322e02abe78c2940bf9e619" + resolved "https://registry.npmjs.org/@blocknote/core/-/core-0.12.4.tgz" integrity sha512-njnrEZUZ7sPm0CIwxSfFfnP1IgB+H+Kvk5+2Etr3tozuQgwdQ0X6wn6E+MTCP97Nxl/aPA7S1F/XUoy1L8ICXQ== dependencies: "@tiptap/core" "^2.0.3" @@ -390,7 +409,7 @@ "@blocknote/react@^0.12.4": version "0.12.4" - resolved "https://registry.yarnpkg.com/@blocknote/react/-/react-0.12.4.tgz#572f8d6ddf500fde17743cbe2b04af8ba457c7da" + resolved "https://registry.npmjs.org/@blocknote/react/-/react-0.12.4.tgz" integrity sha512-cgtQmPUhRmWwHifskhfuwq7SflXTagilblzkfKmkvHYsldeH2WcOHGbgskX5bdx7ulvryrLnTSbXszLuTGd5Hw== dependencies: "@blocknote/core" "^0.12.4" @@ -408,19 +427,19 @@ "@eslint-community/eslint-utils@^4.2.0": version "4.4.0" - resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" + resolved "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz" integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== dependencies: eslint-visitor-keys "^3.3.0" "@eslint-community/regexpp@^4.6.1": version "4.10.0" - resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.10.0.tgz#548f6de556857c8bb73bbee70c35dc82a2e74d63" + resolved "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz" integrity sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA== "@eslint/eslintrc@^2.1.4": version "2.1.4" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz#388a269f0f25c1b6adc317b5a2c55714894c70ad" + resolved "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz" integrity sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ== dependencies: ajv "^6.12.4" @@ -435,19 +454,19 @@ "@eslint/js@8.57.0": version "8.57.0" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.0.tgz#a5417ae8427873f1dd08b70b3574b453e67b5f7f" + resolved "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz" integrity sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g== "@floating-ui/core@^1.0.0": version "1.6.1" - resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-1.6.1.tgz#a4e6fef1b069cda533cbc7a4998c083a37f37573" + resolved "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.1.tgz" integrity sha512-42UH54oPZHPdRHdw6BgoBD6cg/eVTmVrFcgeRDM3jbO7uxSoipVcmcIGFcA5jmOHO5apcyvBhkSKES3fQJnu7A== dependencies: "@floating-ui/utils" "^0.2.0" "@floating-ui/dom@^1.0.0": version "1.6.5" - resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.6.5.tgz#323f065c003f1d3ecf0ff16d2c2c4d38979f4cb9" + resolved "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.5.tgz" integrity sha512-Nsdud2X65Dz+1RHjAIP0t8z5e2ff/IRbei6BqFrl1urT8sDVzM1HMQ+R0XcU5ceRfyO3I6ayeqIfh+6Wb8LGTw== dependencies: "@floating-ui/core" "^1.0.0" @@ -455,14 +474,14 @@ "@floating-ui/react-dom@^2.0.0": version "2.0.9" - resolved "https://registry.yarnpkg.com/@floating-ui/react-dom/-/react-dom-2.0.9.tgz#264ba8b061000baa132b5910f0427a6acf7ad7ce" + resolved "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.9.tgz" integrity sha512-q0umO0+LQK4+p6aGyvzASqKbKOJcAHJ7ycE9CuUvfx3s9zTHWmGJTPOIlM/hmSBfUfg/XfY5YhLBLR/LHwShQQ== dependencies: "@floating-ui/dom" "^1.0.0" "@floating-ui/react@^0.26.4", "@floating-ui/react@^0.26.9": version "0.26.13" - resolved "https://registry.yarnpkg.com/@floating-ui/react/-/react-0.26.13.tgz#81dc03b08ec8db40c48bf2e1f2a2e1a5e9a1997a" + resolved "https://registry.npmjs.org/@floating-ui/react/-/react-0.26.13.tgz" integrity sha512-kBa9wntpugzrZ8t/4yWelvSmEKZdeTXTJzrxqyrLmcU/n1SM4nvse8yQh2e1b37rJGvtu0EplV9+IkBrCJ1vkw== dependencies: "@floating-ui/react-dom" "^2.0.0" @@ -471,12 +490,12 @@ "@floating-ui/utils@^0.2.0": version "0.2.2" - resolved "https://registry.yarnpkg.com/@floating-ui/utils/-/utils-0.2.2.tgz#d8bae93ac8b815b2bd7a98078cf91e2724ef11e5" + resolved "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.2.tgz" integrity sha512-J4yDIIthosAsRZ5CPYP/jQvUAQtlZTTD/4suA08/FEnlxqW3sKS9iAhgsa9VYLZ6vDHn/ixJgIqRQPotoBjxIw== "@generatesac/lib@^0.0.1": version "0.0.1" - resolved "https://registry.yarnpkg.com/@generatesac/lib/-/lib-0.0.1.tgz#ffcbed9a98669ee46d8c639c4d2cf178ec21b1b8" + resolved "https://registry.npmjs.org/@generatesac/lib/-/lib-0.0.1.tgz" integrity sha512-E7Vw3fZlRdxdBUl06H4s/0IzFb7BCAAWP/iHwA/ju0p4ILy0f6mq2hpWvIDqRFLri6NFWdO3eCd23yjN1VQFNQ== dependencies: "@blocknote/core" "^0.12.4" @@ -491,7 +510,7 @@ "@humanwhocodes/config-array@^0.11.14": version "0.11.14" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.14.tgz#d78e481a039f7566ecc9660b4ea7fe6b1fec442b" + resolved "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz" integrity sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg== dependencies: "@humanwhocodes/object-schema" "^2.0.2" @@ -500,17 +519,17 @@ "@humanwhocodes/module-importer@^1.0.1": version "1.0.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" + resolved "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz" integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== "@humanwhocodes/object-schema@^2.0.2": version "2.0.3" - resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz#4a2868d75d6d6963e423bcf90b7fd1be343409d3" + resolved "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz" integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA== "@isaacs/cliui@^8.0.2": version "8.0.2" - resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" + resolved "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz" integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== dependencies: string-width "^5.1.2" @@ -522,7 +541,7 @@ "@istanbuljs/load-nyc-config@^1.0.0": version "1.1.0" - resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" + resolved "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz" integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== dependencies: camelcase "^5.3.1" @@ -533,12 +552,12 @@ "@istanbuljs/schema@^0.1.2", "@istanbuljs/schema@^0.1.3": version "0.1.3" - resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" + resolved "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz" integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== "@jest/console@^29.7.0": version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/console/-/console-29.7.0.tgz#cd4822dbdb84529265c5a2bdb529a3c9cc950ffc" + resolved "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz" integrity sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg== dependencies: "@jest/types" "^29.6.3" @@ -550,7 +569,7 @@ "@jest/core@^29.7.0": version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/core/-/core-29.7.0.tgz#b6cccc239f30ff36609658c5a5e2291757ce448f" + resolved "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz" integrity sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg== dependencies: "@jest/console" "^29.7.0" @@ -584,7 +603,7 @@ "@jest/environment@^29.7.0": version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-29.7.0.tgz#24d61f54ff1f786f3cd4073b4b94416383baf2a7" + resolved "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz" integrity sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw== dependencies: "@jest/fake-timers" "^29.7.0" @@ -594,14 +613,14 @@ "@jest/expect-utils@^29.7.0": version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.7.0.tgz#023efe5d26a8a70f21677d0a1afc0f0a44e3a1c6" + resolved "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz" integrity sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA== dependencies: jest-get-type "^29.6.3" "@jest/expect@^29.7.0": version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-29.7.0.tgz#76a3edb0cb753b70dfbfe23283510d3d45432bf2" + resolved "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz" integrity sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ== dependencies: expect "^29.7.0" @@ -609,7 +628,7 @@ "@jest/fake-timers@^29.7.0": version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-29.7.0.tgz#fd91bf1fffb16d7d0d24a426ab1a47a49881a565" + resolved "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz" integrity sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ== dependencies: "@jest/types" "^29.6.3" @@ -621,7 +640,7 @@ "@jest/globals@^29.7.0": version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-29.7.0.tgz#8d9290f9ec47ff772607fa864ca1d5a2efae1d4d" + resolved "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz" integrity sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ== dependencies: "@jest/environment" "^29.7.0" @@ -631,7 +650,7 @@ "@jest/reporters@^29.7.0": version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-29.7.0.tgz#04b262ecb3b8faa83b0b3d321623972393e8f4c7" + resolved "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz" integrity sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg== dependencies: "@bcoe/v8-coverage" "^0.2.3" @@ -661,14 +680,14 @@ "@jest/schemas@^29.6.3": version "29.6.3" - resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.6.3.tgz#430b5ce8a4e0044a7e3819663305a7b3091c8e03" + resolved "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz" integrity sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA== dependencies: "@sinclair/typebox" "^0.27.8" "@jest/source-map@^29.6.3": version "29.6.3" - resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-29.6.3.tgz#d90ba772095cf37a34a5eb9413f1b562a08554c4" + resolved "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz" integrity sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw== dependencies: "@jridgewell/trace-mapping" "^0.3.18" @@ -677,7 +696,7 @@ "@jest/test-result@^29.7.0": version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-29.7.0.tgz#8db9a80aa1a097bb2262572686734baed9b1657c" + resolved "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz" integrity sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA== dependencies: "@jest/console" "^29.7.0" @@ -687,7 +706,7 @@ "@jest/test-sequencer@^29.7.0": version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz#6cef977ce1d39834a3aea887a1726628a6f072ce" + resolved "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz" integrity sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw== dependencies: "@jest/test-result" "^29.7.0" @@ -697,7 +716,7 @@ "@jest/transform@^29.7.0": version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-29.7.0.tgz#df2dd9c346c7d7768b8a06639994640c642e284c" + resolved "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz" integrity sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw== dependencies: "@babel/core" "^7.11.6" @@ -716,9 +735,9 @@ slash "^3.0.0" write-file-atomic "^4.0.2" -"@jest/types@^29.6.3": +"@jest/types@^29.0.0", "@jest/types@^29.6.3": version "29.6.3" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.6.3.tgz#1131f8cf634e7e84c5e77bab12f052af585fba59" + resolved "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz" integrity sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw== dependencies: "@jest/schemas" "^29.6.3" @@ -730,7 +749,7 @@ "@jridgewell/gen-mapping@^0.3.2", "@jridgewell/gen-mapping@^0.3.5": version "0.3.5" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz#dcce6aff74bdf6dad1a95802b69b04a2fcb1fb36" + resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz" integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg== dependencies: "@jridgewell/set-array" "^1.2.1" @@ -739,22 +758,22 @@ "@jridgewell/resolve-uri@^3.1.0": version "3.1.2" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" + resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz" integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== "@jridgewell/set-array@^1.2.1": version "1.2.1" - resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" + resolved "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz" integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== "@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": version "1.4.15" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" + resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz" integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== "@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.18", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": version "0.3.25" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" + resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz" integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== dependencies: "@jridgewell/resolve-uri" "^3.1.0" @@ -762,7 +781,7 @@ "@mantine/core@^7.7.1": version "7.9.0" - resolved "https://registry.yarnpkg.com/@mantine/core/-/core-7.9.0.tgz#ad7961139fbb77268000e15e3858e54c147d54c2" + resolved "https://registry.npmjs.org/@mantine/core/-/core-7.9.0.tgz" integrity sha512-EhELO1uYq2s08H69h4BCcvE26mNLPaXUi6RAjApqBIynMcyJlmdluFtvGKFxjpgFZy3moeSYNrjEW//T0uTMZg== dependencies: "@floating-ui/react" "^0.26.9" @@ -772,89 +791,49 @@ react-textarea-autosize "8.5.3" type-fest "^4.12.0" -"@mantine/hooks@^7.7.1": +"@mantine/hooks@^7.7.1", "@mantine/hooks@7.9.0": version "7.9.0" - resolved "https://registry.yarnpkg.com/@mantine/hooks/-/hooks-7.9.0.tgz#41ecc95d55da398c8c0718743f8cac13bf66b74d" + resolved "https://registry.npmjs.org/@mantine/hooks/-/hooks-7.9.0.tgz" integrity sha512-LKgyrlaIK0S/gcn/VDbhqLBZOYjvhXfVcH7rMs4MIBVD+wuRo2LvvAYe3cUfQbBCfmlpRjqvewwvsIYYsjSofQ== "@mantine/utils@^6.0.21": version "6.0.21" - resolved "https://registry.yarnpkg.com/@mantine/utils/-/utils-6.0.21.tgz#6185506e91cba3e308aaa8ea9ababc8e767995d6" + resolved "https://registry.npmjs.org/@mantine/utils/-/utils-6.0.21.tgz" integrity sha512-33RVDRop5jiWFao3HKd3Yp7A9mEq4HAJxJPTuYm1NkdqX6aTKOQK7wT8v8itVodBp+sb4cJK6ZVdD1UurK/txQ== "@next/env@14.2.3": version "14.2.3" - resolved "https://registry.yarnpkg.com/@next/env/-/env-14.2.3.tgz#d6def29d1c763c0afb397343a15a82e7d92353a0" + resolved "https://registry.npmjs.org/@next/env/-/env-14.2.3.tgz" integrity sha512-W7fd7IbkfmeeY2gXrzJYDx8D2lWKbVoTIj1o1ScPHNzvp30s1AuoEFSdr39bC5sjxJaxTtq3OTCZboNp0lNWHA== "@next/eslint-plugin-next@14.2.3": version "14.2.3" - resolved "https://registry.yarnpkg.com/@next/eslint-plugin-next/-/eslint-plugin-next-14.2.3.tgz#287ad8620e7061ba01e8d3313d464db6d217b6df" + resolved "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-14.2.3.tgz" integrity sha512-L3oDricIIjgj1AVnRdRor21gI7mShlSwU/1ZGHmqM3LzHhXXhdkrfeNY5zif25Bi5Dd7fiJHsbhoZCHfXYvlAw== dependencies: glob "10.3.10" "@next/swc-darwin-arm64@14.2.3": version "14.2.3" - resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.3.tgz#db1a05eb88c0224089b815ad10ac128ec79c2cdb" + resolved "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.3.tgz" integrity sha512-3pEYo/RaGqPP0YzwnlmPN2puaF2WMLM3apt5jLW2fFdXD9+pqcoTzRk+iZsf8ta7+quAe4Q6Ms0nR0SFGFdS1A== -"@next/swc-darwin-x64@14.2.3": - version "14.2.3" - resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.3.tgz#a3f8af05b5f9a52ac3082e66ac29e125ab1d7b9c" - integrity sha512-6adp7waE6P1TYFSXpY366xwsOnEXM+y1kgRpjSRVI2CBDOcbRjsJ67Z6EgKIqWIue52d2q/Mx8g9MszARj8IEA== - -"@next/swc-linux-arm64-gnu@14.2.3": - version "14.2.3" - resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.3.tgz#4e63f43879285b52554bfd39e6e0cc78a9b27bbf" - integrity sha512-cuzCE/1G0ZSnTAHJPUT1rPgQx1w5tzSX7POXSLaS7w2nIUJUD+e25QoXD/hMfxbsT9rslEXugWypJMILBj/QsA== - -"@next/swc-linux-arm64-musl@14.2.3": - version "14.2.3" - resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.3.tgz#ebdaed26214448b1e6f2c3e8b3cd29bfba387990" - integrity sha512-0D4/oMM2Y9Ta3nGuCcQN8jjJjmDPYpHX9OJzqk42NZGJocU2MqhBq5tWkJrUQOQY9N+In9xOdymzapM09GeiZw== - -"@next/swc-linux-x64-gnu@14.2.3": - version "14.2.3" - resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.3.tgz#19e3bcc137c3b582a1ab867106817e5c90a20593" - integrity sha512-ENPiNnBNDInBLyUU5ii8PMQh+4XLr4pG51tOp6aJ9xqFQ2iRI6IH0Ds2yJkAzNV1CfyagcyzPfROMViS2wOZ9w== - -"@next/swc-linux-x64-musl@14.2.3": - version "14.2.3" - resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.3.tgz#794a539b98e064169cf0ff7741b2a4fb16adec7d" - integrity sha512-BTAbq0LnCbF5MtoM7I/9UeUu/8ZBY0i8SFjUMCbPDOLv+un67e2JgyN4pmgfXBwy/I+RHu8q+k+MCkDN6P9ViQ== - -"@next/swc-win32-arm64-msvc@14.2.3": - version "14.2.3" - resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.3.tgz#eda9fa0fbf1ff9113e87ac2668ee67ce9e5add5a" - integrity sha512-AEHIw/dhAMLNFJFJIJIyOFDzrzI5bAjI9J26gbO5xhAKHYTZ9Or04BesFPXiAYXDNdrwTP2dQceYA4dL1geu8A== - -"@next/swc-win32-ia32-msvc@14.2.3": - version "14.2.3" - resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.3.tgz#7c1190e3f640ab16580c6bdbd7d0e766b9920457" - integrity sha512-vga40n1q6aYb0CLrM+eEmisfKCR45ixQYXuBXxOOmmoV8sYST9k7E3US32FsY+CkkF7NtzdcebiFT4CHuMSyZw== - -"@next/swc-win32-x64-msvc@14.2.3": - version "14.2.3" - resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.3.tgz#2be4e39ee25bfbd85be78eea17c0e7751dc4323c" - integrity sha512-Q1/zm43RWynxrO7lW4ehciQVj+5ePBhOK+/K2P7pLFX3JaJ/IZVC69SHidrmZSOkqz7ECIOhhy7XhAFG4JYyHA== - "@nodelib/fs.scandir@2.1.5": version "2.1.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== dependencies: "@nodelib/fs.stat" "2.0.5" run-parallel "^1.1.9" -"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": +"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5": version "2.0.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== "@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": version "1.2.8" - resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz" integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== dependencies: "@nodelib/fs.scandir" "2.1.5" @@ -862,38 +841,38 @@ "@pkgjs/parseargs@^0.11.0": version "0.11.0" - resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" + resolved "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz" integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== "@pkgr/core@^0.1.0": version "0.1.1" - resolved "https://registry.yarnpkg.com/@pkgr/core/-/core-0.1.1.tgz#1ec17e2edbec25c8306d424ecfbf13c7de1aaa31" + resolved "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz" integrity sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA== "@popperjs/core@^2.9.0": version "2.11.8" - resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.8.tgz#6b79032e760a0899cd4204710beede972a3a185f" + resolved "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz" integrity sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A== "@radix-ui/react-compose-refs@1.0.1": version "1.0.1" - resolved "https://registry.yarnpkg.com/@radix-ui/react-compose-refs/-/react-compose-refs-1.0.1.tgz#7ed868b66946aa6030e580b1ffca386dd4d21989" + resolved "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.0.1.tgz" integrity sha512-fDSBgd44FKHa1FRMU59qBMPFcl2PZE+2nmqunj+BWFyYYjnhIDWL2ItDs3rrbJDQOtzt5nIebLCQc4QRfz6LJw== dependencies: "@babel/runtime" "^7.13.10" "@radix-ui/react-slot@^1.0.2": version "1.0.2" - resolved "https://registry.yarnpkg.com/@radix-ui/react-slot/-/react-slot-1.0.2.tgz#a9ff4423eade67f501ffb32ec22064bc9d3099ab" + resolved "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.0.2.tgz" integrity sha512-YeTpuq4deV+6DusvVUW4ivBgnkHwECUu0BiN43L5UCDFgdhsRUWAghhTF5MbvNTPzmiFOx90asDSUjWuCNapwg== dependencies: "@babel/runtime" "^7.13.10" "@radix-ui/react-compose-refs" "1.0.1" "@reduxjs/toolkit@^2.2.3", "@reduxjs/toolkit@^2.2.4": - version "2.2.4" - resolved "https://registry.yarnpkg.com/@reduxjs/toolkit/-/toolkit-2.2.4.tgz#d9c25c2811d5aa92ff18f9483fe2223b0dbd33d5" - integrity sha512-EoIC9iC2V/DLRBVMXRHrO/oM3QBT7RuJNeBRx8Cpnz/NHINeZBEqgI8YOxAYUjLp+KYxGgc4Wd6KoAKsaUBGhg== + version "2.2.5" + resolved "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.2.5.tgz" + integrity sha512-aeFA/s5NCG7NoJe/MhmwREJxRkDs0ZaSqt0MxhWUrwCf1UQXpwR87RROJEql0uAkLI6U7snBOYOcKw83ew3FPg== dependencies: immer "^10.0.3" redux "^5.0.1" @@ -902,160 +881,160 @@ "@remirror/core-constants@^2.0.2": version "2.0.2" - resolved "https://registry.yarnpkg.com/@remirror/core-constants/-/core-constants-2.0.2.tgz#f05eccdc69e3a65e7d524b52548f567904a11a1a" + resolved "https://registry.npmjs.org/@remirror/core-constants/-/core-constants-2.0.2.tgz" integrity sha512-dyHY+sMF0ihPus3O27ODd4+agdHMEmuRdyiZJ2CCWjPV5UFmn17ZbElvk6WOGVE4rdCJKZQCrPV2BcikOMLUGQ== "@rushstack/eslint-patch@^1.3.3": version "1.10.2" - resolved "https://registry.yarnpkg.com/@rushstack/eslint-patch/-/eslint-patch-1.10.2.tgz#053f1540703faa81dea2966b768ee5581c66aeda" + resolved "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.10.2.tgz" integrity sha512-hw437iINopmQuxWPSUEvqE56NCPsiU8N4AYtfHmJFckclktzK9YQJieD3XkDCDH4OjL+C7zgPUh73R/nrcHrqw== "@sinclair/typebox@^0.27.8": version "0.27.8" - resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.8.tgz#6667fac16c436b5434a387a34dedb013198f6e6e" + resolved "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz" integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== "@sinonjs/commons@^3.0.0": version "3.0.1" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-3.0.1.tgz#1029357e44ca901a615585f6d27738dbc89084cd" + resolved "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz" integrity sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ== dependencies: type-detect "4.0.8" "@sinonjs/fake-timers@^10.0.2": version "10.3.0" - resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz#55fdff1ecab9f354019129daf4df0dd4d923ea66" + resolved "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz" integrity sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA== dependencies: "@sinonjs/commons" "^3.0.0" "@swc/counter@^0.1.3": version "0.1.3" - resolved "https://registry.yarnpkg.com/@swc/counter/-/counter-0.1.3.tgz#cc7463bd02949611c6329596fccd2b0ec782b0e9" + resolved "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz" integrity sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ== "@swc/helpers@0.5.5": version "0.5.5" - resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.5.5.tgz#12689df71bfc9b21c4f4ca00ae55f2f16c8b77c0" + resolved "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.5.tgz" integrity sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A== dependencies: "@swc/counter" "^0.1.3" tslib "^2.4.0" -"@tiptap/core@^2.0.3": +"@tiptap/core@^2.0.0", "@tiptap/core@^2.0.3": version "2.3.1" - resolved "https://registry.yarnpkg.com/@tiptap/core/-/core-2.3.1.tgz#e6980554882899b2c600f40b688c33b6b58628c2" + resolved "https://registry.npmjs.org/@tiptap/core/-/core-2.3.1.tgz" integrity sha512-ycpQlmczAOc05TgB5sc3RUTEEBXAVmS8MR9PqQzg96qidaRfVkgE+2w4k7t83PMHl2duC0MGqOCy96pLYwSpeg== "@tiptap/extension-bold@^2.0.3": version "2.3.1" - resolved "https://registry.yarnpkg.com/@tiptap/extension-bold/-/extension-bold-2.3.1.tgz#73ccc70b339b95bc68f452851933fdd1d45c7c98" + resolved "https://registry.npmjs.org/@tiptap/extension-bold/-/extension-bold-2.3.1.tgz" integrity sha512-szHDXKOQfrlCzsys401zBtPWE5gyY3LcpPlrn2zBRrBmzU2U/1A7Y3HkoqZo3SSrTY37eG1Vr2J2aHySK6Uj/w== "@tiptap/extension-bubble-menu@^2.3.1": version "2.3.1" - resolved "https://registry.yarnpkg.com/@tiptap/extension-bubble-menu/-/extension-bubble-menu-2.3.1.tgz#c4be5dce91ce221bff08d2bf5b167f3d4b96e514" + resolved "https://registry.npmjs.org/@tiptap/extension-bubble-menu/-/extension-bubble-menu-2.3.1.tgz" integrity sha512-6PGrk65f0eXHcCEe6A2/GpooMsD6RPZY1kWSSWUNfklJO54R/8uAtsSVIBr7wQ34pvrYkNaluRUrDWUokWyBOQ== dependencies: tippy.js "^6.3.7" "@tiptap/extension-code@^2.0.3": version "2.3.1" - resolved "https://registry.yarnpkg.com/@tiptap/extension-code/-/extension-code-2.3.1.tgz#cea919becab684688819b29481a5c43ee1ee9c52" + resolved "https://registry.npmjs.org/@tiptap/extension-code/-/extension-code-2.3.1.tgz" integrity sha512-bVX0EnDZoRXnoA7dyoZe7w2gdRjxmFEcsatHLkcr3R3x4k9oSgZXLe1C2jGbjJWr4j32tYXZ1cpKte6f1WUKzg== "@tiptap/extension-collaboration-cursor@^2.0.3": version "2.3.1" - resolved "https://registry.yarnpkg.com/@tiptap/extension-collaboration-cursor/-/extension-collaboration-cursor-2.3.1.tgz#cd74490f1eefa48af38dee4b309d976c960aa6b7" + resolved "https://registry.npmjs.org/@tiptap/extension-collaboration-cursor/-/extension-collaboration-cursor-2.3.1.tgz" integrity sha512-r4vBfuUiz+o2p62UJUmKruvoHgNS67sOBk2P5zYDljVEg2O8ydZVU2qmBdDgfyqQG3aO/p4tYDCCZeVsoYQngA== "@tiptap/extension-collaboration@^2.0.3": version "2.3.1" - resolved "https://registry.yarnpkg.com/@tiptap/extension-collaboration/-/extension-collaboration-2.3.1.tgz#86a4aafbdb638c86f00eec169a7658f3cb158944" + resolved "https://registry.npmjs.org/@tiptap/extension-collaboration/-/extension-collaboration-2.3.1.tgz" integrity sha512-d/azeir3H2v8epywquDMpDaz0BcLJddwGkSB/MMJe6Q58fEenRCad5/GE3zs0bMEhA0WELq9YtWLO87xrUQg9A== "@tiptap/extension-dropcursor@^2.0.3": version "2.3.1" - resolved "https://registry.yarnpkg.com/@tiptap/extension-dropcursor/-/extension-dropcursor-2.3.1.tgz#2a594264c9b56c23d9a8e46e8538d6b72860e10f" + resolved "https://registry.npmjs.org/@tiptap/extension-dropcursor/-/extension-dropcursor-2.3.1.tgz" integrity sha512-xDG1Z01ftRI4mIOY+bPuG53xZ9FfVd6hzjNchwFHRlU3E+/2O+DsEBy/pJuHmpnFx1B/1ANbssoidGvK3LIPYw== "@tiptap/extension-floating-menu@^2.3.1": version "2.3.1" - resolved "https://registry.yarnpkg.com/@tiptap/extension-floating-menu/-/extension-floating-menu-2.3.1.tgz#55eb688565281696b3bcebb53f774f4cbd7c8ce8" + resolved "https://registry.npmjs.org/@tiptap/extension-floating-menu/-/extension-floating-menu-2.3.1.tgz" integrity sha512-3+dONthHRMFzJjLF9JtRbm9u4XJs8txCoChsZjwD0wBf8XfPtUGZQn9W5xNJG+5pozrOQhj9KC1UZL4tuvSRkg== dependencies: tippy.js "^6.3.7" "@tiptap/extension-gapcursor@^2.0.3": version "2.3.1" - resolved "https://registry.yarnpkg.com/@tiptap/extension-gapcursor/-/extension-gapcursor-2.3.1.tgz#a31d87995ca7d8b58af27e55a14e6eb6b5c0a2c5" + resolved "https://registry.npmjs.org/@tiptap/extension-gapcursor/-/extension-gapcursor-2.3.1.tgz" integrity sha512-jhMw0LtEV/HVovUDRdoH0QLnBWLDyw4Su7UZ0bkMtsnCO9MujLKths3SKsPstuAckZQKR5smokEytxDHH0aglg== "@tiptap/extension-hard-break@^2.0.3": version "2.3.1" - resolved "https://registry.yarnpkg.com/@tiptap/extension-hard-break/-/extension-hard-break-2.3.1.tgz#c174915cc32865f9c742104d1c75ffa3afc477f4" + resolved "https://registry.npmjs.org/@tiptap/extension-hard-break/-/extension-hard-break-2.3.1.tgz" integrity sha512-HO47iS2KQJLxhZM4ghZz5t2qgESH6D/mKJbjO7jM0eCYEyUfPyYJwV2VgjQP7x+1axcvsrhpzkJrjSg5+KqtQQ== "@tiptap/extension-history@^2.0.3": version "2.3.1" - resolved "https://registry.yarnpkg.com/@tiptap/extension-history/-/extension-history-2.3.1.tgz#de6ec11ac686856ea1f0806b69452f2e39696baf" + resolved "https://registry.npmjs.org/@tiptap/extension-history/-/extension-history-2.3.1.tgz" integrity sha512-m+W6qTP4V0PHqqKnXw/ma18a62O0Cqp5FDWtSarOuxx6W4FpVr4A3Uxfbp4RigZEYanLcX4UJOWL4nWsFdYWHw== "@tiptap/extension-horizontal-rule@^2.0.3": version "2.3.1" - resolved "https://registry.yarnpkg.com/@tiptap/extension-horizontal-rule/-/extension-horizontal-rule-2.3.1.tgz#82330ab9a6a27484145bc73b9b7d23dce0e5594f" + resolved "https://registry.npmjs.org/@tiptap/extension-horizontal-rule/-/extension-horizontal-rule-2.3.1.tgz" integrity sha512-IPgCFkiT6Y5BSFBQMTXS6gq2Ust6otMzRwddoI0RC8tl/tMftFBEPqYKADWVQeQb4C6AQydRjUbmAwHpBH31Eg== "@tiptap/extension-italic@^2.0.3": version "2.3.1" - resolved "https://registry.yarnpkg.com/@tiptap/extension-italic/-/extension-italic-2.3.1.tgz#376a1957dff7b687ce247f8a79dc397cb9c7565a" + resolved "https://registry.npmjs.org/@tiptap/extension-italic/-/extension-italic-2.3.1.tgz" integrity sha512-yEAn0dT1LH1vAULmZv3L1fs7M1Fn/8wZCw7LDGw2/E+VYbDeXgy7XwMPyzhrzV1oV9Z+3gugCbYV0IJ4PBwudA== "@tiptap/extension-link@^2.0.3": version "2.3.1" - resolved "https://registry.yarnpkg.com/@tiptap/extension-link/-/extension-link-2.3.1.tgz#519e320c52902440912f676879c497b9cbfd1944" + resolved "https://registry.npmjs.org/@tiptap/extension-link/-/extension-link-2.3.1.tgz" integrity sha512-VE54iLwWcPldqZl7a4E/pmGD7waCWS//VT8jxTuFUroTouIzT+OjB9DQAXMkrRiaz+na3I8Jie1yBE+zYB0gvQ== dependencies: linkifyjs "^4.1.0" "@tiptap/extension-paragraph@^2.0.3": version "2.3.1" - resolved "https://registry.yarnpkg.com/@tiptap/extension-paragraph/-/extension-paragraph-2.3.1.tgz#2aa53a06cfad637640bf65a7cd0ab2ef5f5a5c10" + resolved "https://registry.npmjs.org/@tiptap/extension-paragraph/-/extension-paragraph-2.3.1.tgz" integrity sha512-bHkkHU012clwCrpzmEHGuF8fwLuFL3x9MJ17wnhwanoIM3MG6ZCdeb9copjDvUpZXLKTUYKotoPGNhxmOrP2bQ== "@tiptap/extension-strike@^2.0.3": version "2.3.1" - resolved "https://registry.yarnpkg.com/@tiptap/extension-strike/-/extension-strike-2.3.1.tgz#2e47c711b85f46c7e575b0b154cedc93ab9bc89b" + resolved "https://registry.npmjs.org/@tiptap/extension-strike/-/extension-strike-2.3.1.tgz" integrity sha512-fpsVewcnaYk37TAF4JHkwH9O6Ml7JooF1v/Eh9p7PSItNcEfg/3RLlJL3c53RzLWdlunjgptM/M0alPV0Zyq4A== "@tiptap/extension-table-cell@^2.0.3": version "2.3.1" - resolved "https://registry.yarnpkg.com/@tiptap/extension-table-cell/-/extension-table-cell-2.3.1.tgz#94619e2b5c118f0c1c660c605b7baaff55ee4bfd" + resolved "https://registry.npmjs.org/@tiptap/extension-table-cell/-/extension-table-cell-2.3.1.tgz" integrity sha512-xjCmpokTRyU4OcUbrXchPkZhUY5ACNyNYPwxWcXlZHG8rFbF/UJFHt22VZzMFLb33iBWgsPR9MfPtSL4+wdm4Q== "@tiptap/extension-table-header@^2.0.3": version "2.3.1" - resolved "https://registry.yarnpkg.com/@tiptap/extension-table-header/-/extension-table-header-2.3.1.tgz#baeeebc8e81398c30fdac86b578f70abbb412318" + resolved "https://registry.npmjs.org/@tiptap/extension-table-header/-/extension-table-header-2.3.1.tgz" integrity sha512-hAQjjPie+QDW851CsmknoPI1hkB54mur0EudHxuEMCTweMZJseiO+IggNdQT3YdlUcV/UZTJdnhtOvmpHHLQ1w== "@tiptap/extension-table-row@^2.0.3": version "2.3.1" - resolved "https://registry.yarnpkg.com/@tiptap/extension-table-row/-/extension-table-row-2.3.1.tgz#a2e19228a0f545256fa7d183f34472ae4f525ab5" + resolved "https://registry.npmjs.org/@tiptap/extension-table-row/-/extension-table-row-2.3.1.tgz" integrity sha512-TYUj1XXdVGHrQOs1MiErB064Wp6vJeInViuN+fXt/u/Fc4LbQzfXbMsjqALfcfajJdGgqHBNBV25lzCrFGTJ8w== "@tiptap/extension-text@^2.0.3": version "2.3.1" - resolved "https://registry.yarnpkg.com/@tiptap/extension-text/-/extension-text-2.3.1.tgz#c5ded941eab937ea4743b88ff27c5eac971fe3db" + resolved "https://registry.npmjs.org/@tiptap/extension-text/-/extension-text-2.3.1.tgz" integrity sha512-ZM+Bpty9jChEN/VjUP/fX1Fvoz0Z3YLdjj9+pFA0H7woli+TmxWY6yUUTA2SBDb2mJ52yNOUfRE/sYx6gkDuBQ== "@tiptap/extension-underline@^2.0.3": version "2.3.1" - resolved "https://registry.yarnpkg.com/@tiptap/extension-underline/-/extension-underline-2.3.1.tgz#90a594cc69644464f1070b4bd36ed4bed4ce3c38" + resolved "https://registry.npmjs.org/@tiptap/extension-underline/-/extension-underline-2.3.1.tgz" integrity sha512-xgLGr7bM5OAKagUKdL5dWxJHgwEp2fk3D5XCVUBwqgeOZtOFteoqPzb/2617w7qrP+9oM9zRjw6z27hM8YxyvQ== -"@tiptap/pm@^2.0.3", "@tiptap/pm@^2.3.1": +"@tiptap/pm@^2.0.0", "@tiptap/pm@^2.0.3", "@tiptap/pm@^2.3.1": version "2.3.1" - resolved "https://registry.yarnpkg.com/@tiptap/pm/-/pm-2.3.1.tgz#253edd2e4e02ec6f666b82ecb185e9ec32ecb0d3" + resolved "https://registry.npmjs.org/@tiptap/pm/-/pm-2.3.1.tgz" integrity sha512-jdd1PFAFeewcu1rWsiqoCc04u5NCplHVjsGPN4jxUmqKdU0YN/9sp7h8gRG6YN1GZRoC1Y6KD+WPLMdzkwizZQ== dependencies: prosemirror-changeset "^2.2.1" @@ -1079,7 +1058,7 @@ "@tiptap/react@^2.0.3": version "2.3.1" - resolved "https://registry.yarnpkg.com/@tiptap/react/-/react-2.3.1.tgz#cbaafd3de56588a84146880a9a4aa282c9aca3b0" + resolved "https://registry.npmjs.org/@tiptap/react/-/react-2.3.1.tgz" integrity sha512-MM6UOi5nmdM/dZXYtbBYHJEsVtyyFFnOCXlXmhTlhz0WYI8VkEAY7XWLB96KrqsbRk9PUWwdev7iT1q40zxVeg== dependencies: "@tiptap/extension-bubble-menu" "^2.3.1" @@ -1087,7 +1066,7 @@ "@trivago/prettier-plugin-sort-imports@^4.3.0": version "4.3.0" - resolved "https://registry.yarnpkg.com/@trivago/prettier-plugin-sort-imports/-/prettier-plugin-sort-imports-4.3.0.tgz#725f411646b3942193a37041c84e0b2116339789" + resolved "https://registry.npmjs.org/@trivago/prettier-plugin-sort-imports/-/prettier-plugin-sort-imports-4.3.0.tgz" integrity sha512-r3n0onD3BTOVUNPhR4lhVK4/pABGpbA7bW3eumZnYdKaHkf1qEC+Mag6DPbGNuuh0eG8AaYj+YqmVHSiGslaTQ== dependencies: "@babel/generator" "7.17.7" @@ -1099,7 +1078,7 @@ "@types/babel__core@^7.1.14": version "7.20.5" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.5.tgz#3df15f27ba85319caa07ba08d0721889bb39c017" + resolved "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz" integrity sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA== dependencies: "@babel/parser" "^7.20.7" @@ -1110,14 +1089,14 @@ "@types/babel__generator@*": version "7.6.8" - resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.8.tgz#f836c61f48b1346e7d2b0d93c6dacc5b9535d3ab" + resolved "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz" integrity sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw== dependencies: "@babel/types" "^7.0.0" "@types/babel__template@*": version "7.4.4" - resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.4.tgz#5672513701c1b2199bc6dad636a9d7491586766f" + resolved "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz" integrity sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A== dependencies: "@babel/parser" "^7.1.0" @@ -1125,147 +1104,155 @@ "@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": version "7.20.5" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.5.tgz#7b7502be0aa80cc4ef22978846b983edaafcd4dd" + resolved "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.5.tgz" integrity sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ== dependencies: "@babel/types" "^7.20.7" "@types/debug@^4.0.0": version "4.1.12" - resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.12.tgz#a155f21690871953410df4b6b6f53187f0500917" + resolved "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz" integrity sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ== dependencies: "@types/ms" "*" "@types/extend@^3.0.0": version "3.0.4" - resolved "https://registry.yarnpkg.com/@types/extend/-/extend-3.0.4.tgz#5f9aa502299e1b9beb9ade57ea9e36898de0ff52" + resolved "https://registry.npmjs.org/@types/extend/-/extend-3.0.4.tgz" integrity sha512-ArMouDUTJEz1SQRpFsT2rIw7DeqICFv5aaVzLSIYMYQSLcwcGOfT3VyglQs/p7K3F7fT4zxr0NWxYZIdifD6dA== "@types/graceful-fs@^4.1.3": version "4.1.9" - resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.9.tgz#2a06bc0f68a20ab37b3e36aa238be6abdf49e8b4" + resolved "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz" integrity sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ== dependencies: "@types/node" "*" "@types/hast@^2.0.0": version "2.3.10" - resolved "https://registry.yarnpkg.com/@types/hast/-/hast-2.3.10.tgz#5c9d9e0b304bbb8879b857225c5ebab2d81d7643" + resolved "https://registry.npmjs.org/@types/hast/-/hast-2.3.10.tgz" integrity sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw== dependencies: "@types/unist" "^2" "@types/hast@^3.0.0": version "3.0.4" - resolved "https://registry.yarnpkg.com/@types/hast/-/hast-3.0.4.tgz#1d6b39993b82cea6ad783945b0508c25903e15aa" + resolved "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz" integrity sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ== dependencies: "@types/unist" "*" "@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": version "2.0.6" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz#7739c232a1fee9b4d3ce8985f314c0c6d33549d7" + resolved "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz" integrity sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w== "@types/istanbul-lib-report@*": version "3.0.3" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz#53047614ae72e19fc0401d872de3ae2b4ce350bf" + resolved "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz" integrity sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA== dependencies: "@types/istanbul-lib-coverage" "*" "@types/istanbul-reports@^3.0.0": version "3.0.4" - resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz#0f03e3d2f670fbdac586e34b433783070cc16f54" + resolved "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz" integrity sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ== dependencies: "@types/istanbul-lib-report" "*" +"@types/jest@^29.5.12": + version "29.5.12" + resolved "https://registry.npmjs.org/@types/jest/-/jest-29.5.12.tgz" + integrity sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw== + dependencies: + expect "^29.0.0" + pretty-format "^29.0.0" + "@types/json5@^0.0.29": version "0.0.29" - resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" + resolved "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz" integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== "@types/mdast@^3.0.0": version "3.0.15" - resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.15.tgz#49c524a263f30ffa28b71ae282f813ed000ab9f5" + resolved "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz" integrity sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ== dependencies: "@types/unist" "^2" "@types/ms@*": version "0.7.34" - resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.34.tgz#10964ba0dee6ac4cd462e2795b6bebd407303433" + resolved "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz" integrity sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g== "@types/node@*", "@types/node@^20": - version "20.12.11" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.12.11.tgz#c4ef00d3507000d17690643278a60dc55a9dc9be" - integrity sha512-vDg9PZ/zi+Nqp6boSOT7plNuthRugEKixDv5sFTIpkE89MmNtEArAShI4mxuX2+UrLEe9pxC1vm2cjm9YlWbJw== + version "20.12.10" + resolved "https://registry.npmjs.org/@types/node/-/node-20.12.10.tgz" + integrity sha512-Eem5pH9pmWBHoGAT8Dr5fdc5rYA+4NAovdM4EktRPVAAiJhmWWfQrA0cFhAbOsQdSfIHjAud6YdkbL69+zSKjw== dependencies: undici-types "~5.26.4" "@types/parse5@^6.0.0": version "6.0.3" - resolved "https://registry.yarnpkg.com/@types/parse5/-/parse5-6.0.3.tgz#705bb349e789efa06f43f128cef51240753424cb" + resolved "https://registry.npmjs.org/@types/parse5/-/parse5-6.0.3.tgz" integrity sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g== "@types/prop-types@*": version "15.7.12" - resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.12.tgz#12bb1e2be27293c1406acb6af1c3f3a1481d98c6" + resolved "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz" integrity sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q== "@types/react-dom@^18": version "18.3.0" - resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.3.0.tgz#0cbc818755d87066ab6ca74fbedb2547d74a82b0" + resolved "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.0.tgz" integrity sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg== dependencies: "@types/react" "*" -"@types/react@*", "@types/react@^18": - version "18.3.2" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.3.2.tgz#462ae4904973bc212fa910424d901e3d137dbfcd" - integrity sha512-Btgg89dAnqD4vV7R3hlwOxgqobUQKgx3MmrQRi0yYbs/P0ym8XozIAlkqVilPqHQwXs4e9Tf63rrCgl58BcO4w== +"@types/react@*", "@types/react@^16.8.0 || ^17.0.0 || ^18.0.0", "@types/react@^16.9.0 || ^17.0.0 || ^18.0.0", "@types/react@^18", "@types/react@^18.2.25": + version "18.3.1" + resolved "https://registry.npmjs.org/@types/react/-/react-18.3.1.tgz" + integrity sha512-V0kuGBX3+prX+DQ/7r2qsv1NsdfnCLnTgnRJ1pYnxykBhGMz+qj+box5lq7XsO5mtZsBqpjwwTu/7wszPfMBcw== dependencies: "@types/prop-types" "*" csstype "^3.0.2" "@types/stack-utils@^2.0.0": version "2.0.3" - resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.3.tgz#6209321eb2c1712a7e7466422b8cb1fc0d9dd5d8" + resolved "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz" integrity sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw== "@types/unist@*", "@types/unist@^3.0.0": version "3.0.2" - resolved "https://registry.yarnpkg.com/@types/unist/-/unist-3.0.2.tgz#6dd61e43ef60b34086287f83683a5c1b2dc53d20" + resolved "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz" integrity sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ== "@types/unist@^2", "@types/unist@^2.0.0": version "2.0.10" - resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.10.tgz#04ffa7f406ab628f7f7e97ca23e290cd8ab15efc" + resolved "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz" integrity sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA== "@types/use-sync-external-store@^0.0.3": version "0.0.3" - resolved "https://registry.yarnpkg.com/@types/use-sync-external-store/-/use-sync-external-store-0.0.3.tgz#b6725d5f4af24ace33b36fafd295136e75509f43" + resolved "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.3.tgz" integrity sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA== "@types/yargs-parser@*": version "21.0.3" - resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.3.tgz#815e30b786d2e8f0dcd85fd5bcf5e1a04d008f15" + resolved "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz" integrity sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ== "@types/yargs@^17.0.8": version "17.0.32" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.32.tgz#030774723a2f7faafebf645f4e5a48371dca6229" + resolved "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz" integrity sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog== dependencies: "@types/yargs-parser" "*" "@typescript-eslint/parser@^5.4.2 || ^6.0.0 || 7.0.0 - 7.2.0": version "7.2.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-7.2.0.tgz#44356312aea8852a3a82deebdacd52ba614ec07a" + resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.2.0.tgz" integrity sha512-5FKsVcHTk6TafQKQbuIVkXq58Fnbkd2wDL4LB7AURN7RUOu1utVP+G8+6u3ZhEroW3DF6hyo3ZEXxgKgp4KeCg== dependencies: "@typescript-eslint/scope-manager" "7.2.0" @@ -1276,7 +1263,7 @@ "@typescript-eslint/scope-manager@7.2.0": version "7.2.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-7.2.0.tgz#cfb437b09a84f95a0930a76b066e89e35d94e3da" + resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.2.0.tgz" integrity sha512-Qh976RbQM/fYtjx9hs4XkayYujB/aPwglw2choHmf3zBjB4qOywWSdt9+KLRdHubGcoSwBnXUH2sR3hkyaERRg== dependencies: "@typescript-eslint/types" "7.2.0" @@ -1284,12 +1271,12 @@ "@typescript-eslint/types@7.2.0": version "7.2.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-7.2.0.tgz#0feb685f16de320e8520f13cca30779c8b7c403f" + resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.2.0.tgz" integrity sha512-XFtUHPI/abFhm4cbCDc5Ykc8npOKBSJePY3a3s+lwumt7XWJuzP5cZcfZ610MIPHjQjNsOLlYK8ASPaNG8UiyA== "@typescript-eslint/typescript-estree@7.2.0": version "7.2.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-7.2.0.tgz#5beda2876c4137f8440c5a84b4f0370828682556" + resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.2.0.tgz" integrity sha512-cyxS5WQQCoBwSakpMrvMXuMDEbhOo9bNHHrNcEWis6XHx6KF518tkF1wBvKIn/tpq5ZpUYK7Bdklu8qY0MsFIA== dependencies: "@typescript-eslint/types" "7.2.0" @@ -1303,7 +1290,7 @@ "@typescript-eslint/visitor-keys@7.2.0": version "7.2.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-7.2.0.tgz#5035f177752538a5750cca1af6044b633610bf9e" + resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.2.0.tgz" integrity sha512-c6EIQRHhcpl6+tO8EMR+kjkkV+ugUNXOmeASA1rlzkd8EPIriavpWoiEz1HR/VLhbVIdhqnV6E7JZm00cBDx2A== dependencies: "@typescript-eslint/types" "7.2.0" @@ -1311,22 +1298,22 @@ "@ungap/structured-clone@^1.2.0": version "1.2.0" - resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" + resolved "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz" integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== acorn-jsx@^5.3.2: version "5.3.2" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== -acorn@^8.9.0: +"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", acorn@^8.9.0: version "8.11.3" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a" + resolved "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz" integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== ajv@^6.12.4: version "6.12.6" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== dependencies: fast-deep-equal "^3.1.1" @@ -1336,53 +1323,53 @@ ajv@^6.12.4: ansi-escapes@^4.2.1: version "4.3.2" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" + resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz" integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== dependencies: type-fest "^0.21.3" ansi-regex@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== ansi-regex@^6.0.1: version "6.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz" integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== ansi-styles@^3.2.1: version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== dependencies: color-convert "^1.9.0" ansi-styles@^4.0.0, ansi-styles@^4.1.0: version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== dependencies: color-convert "^2.0.1" ansi-styles@^5.0.0: version "5.2.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz" integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== ansi-styles@^6.1.0: version "6.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz" integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== any-promise@^1.0.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" + resolved "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz" integrity sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A== anymatch@^3.0.3, anymatch@~3.1.2: version "3.1.3" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz" integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== dependencies: normalize-path "^3.0.0" @@ -1390,31 +1377,31 @@ anymatch@^3.0.3, anymatch@~3.1.2: arg@^5.0.2: version "5.0.2" - resolved "https://registry.yarnpkg.com/arg/-/arg-5.0.2.tgz#c81433cc427c92c4dcf4865142dbca6f15acd59c" + resolved "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz" integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg== argparse@^1.0.7: version "1.0.10" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + resolved "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz" integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== dependencies: sprintf-js "~1.0.2" argparse@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== aria-query@^5.3.0: version "5.3.0" - resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.3.0.tgz#650c569e41ad90b51b3d7df5e5eed1c7549c103e" + resolved "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz" integrity sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A== dependencies: dequal "^2.0.3" array-buffer-byte-length@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz#1e5583ec16763540a27ae52eed99ff899223568f" + resolved "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz" integrity sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg== dependencies: call-bind "^1.0.5" @@ -1422,7 +1409,7 @@ array-buffer-byte-length@^1.0.1: array-includes@^3.1.6, array-includes@^3.1.7: version "3.1.8" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.8.tgz#5e370cbe172fdd5dd6530c1d4aadda25281ba97d" + resolved "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz" integrity sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ== dependencies: call-bind "^1.0.7" @@ -1434,12 +1421,12 @@ array-includes@^3.1.6, array-includes@^3.1.7: array-union@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + resolved "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz" integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== array.prototype.findlast@^1.2.4: version "1.2.5" - resolved "https://registry.yarnpkg.com/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz#3e4fbcb30a15a7f5bf64cf2faae22d139c2e4904" + resolved "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz" integrity sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ== dependencies: call-bind "^1.0.7" @@ -1451,7 +1438,7 @@ array.prototype.findlast@^1.2.4: array.prototype.findlastindex@^1.2.3: version "1.2.5" - resolved "https://registry.yarnpkg.com/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz#8c35a755c72908719453f87145ca011e39334d0d" + resolved "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz" integrity sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ== dependencies: call-bind "^1.0.7" @@ -1463,7 +1450,7 @@ array.prototype.findlastindex@^1.2.3: array.prototype.flat@^1.3.1, array.prototype.flat@^1.3.2: version "1.3.2" - resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz#1476217df8cff17d72ee8f3ba06738db5b387d18" + resolved "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz" integrity sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA== dependencies: call-bind "^1.0.2" @@ -1473,7 +1460,7 @@ array.prototype.flat@^1.3.1, array.prototype.flat@^1.3.2: array.prototype.flatmap@^1.3.2: version "1.3.2" - resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz#c9a7c6831db8e719d6ce639190146c24bbd3e527" + resolved "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz" integrity sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ== dependencies: call-bind "^1.0.2" @@ -1483,7 +1470,7 @@ array.prototype.flatmap@^1.3.2: array.prototype.toreversed@^1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/array.prototype.toreversed/-/array.prototype.toreversed-1.1.2.tgz#b989a6bf35c4c5051e1dc0325151bf8088954eba" + resolved "https://registry.npmjs.org/array.prototype.toreversed/-/array.prototype.toreversed-1.1.2.tgz" integrity sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA== dependencies: call-bind "^1.0.2" @@ -1493,7 +1480,7 @@ array.prototype.toreversed@^1.1.2: array.prototype.tosorted@^1.1.3: version "1.1.3" - resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.3.tgz#c8c89348337e51b8a3c48a9227f9ce93ceedcba8" + resolved "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.3.tgz" integrity sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg== dependencies: call-bind "^1.0.5" @@ -1504,7 +1491,7 @@ array.prototype.tosorted@^1.1.3: arraybuffer.prototype.slice@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz#097972f4255e41bc3425e37dc3f6421cf9aefde6" + resolved "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz" integrity sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A== dependencies: array-buffer-byte-length "^1.0.1" @@ -1518,12 +1505,12 @@ arraybuffer.prototype.slice@^1.0.3: ast-types-flow@^0.0.8: version "0.0.8" - resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.8.tgz#0a85e1c92695769ac13a428bb653e7538bea27d6" + resolved "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz" integrity sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ== autoprefixer@^10.4.19: version "10.4.19" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.19.tgz#ad25a856e82ee9d7898c59583c1afeb3fa65f89f" + resolved "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.19.tgz" integrity sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew== dependencies: browserslist "^4.23.0" @@ -1535,26 +1522,26 @@ autoprefixer@^10.4.19: available-typed-arrays@^1.0.7: version "1.0.7" - resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846" + resolved "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz" integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ== dependencies: possible-typed-array-names "^1.0.0" axe-core@=4.7.0: version "4.7.0" - resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.7.0.tgz#34ba5a48a8b564f67e103f0aa5768d76e15bbbbf" + resolved "https://registry.npmjs.org/axe-core/-/axe-core-4.7.0.tgz" integrity sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ== axobject-query@^3.2.1: version "3.2.1" - resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-3.2.1.tgz#39c378a6e3b06ca679f29138151e45b2b32da62a" + resolved "https://registry.npmjs.org/axobject-query/-/axobject-query-3.2.1.tgz" integrity sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg== dependencies: dequal "^2.0.3" -babel-jest@^29.7.0: +babel-jest@^29.0.0, babel-jest@^29.7.0: version "29.7.0" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.7.0.tgz#f4369919225b684c56085998ac63dbd05be020d5" + resolved "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz" integrity sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg== dependencies: "@jest/transform" "^29.7.0" @@ -1567,7 +1554,7 @@ babel-jest@^29.7.0: babel-plugin-istanbul@^6.1.1: version "6.1.1" - resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" + resolved "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz" integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" @@ -1578,7 +1565,7 @@ babel-plugin-istanbul@^6.1.1: babel-plugin-jest-hoist@^29.6.3: version "29.6.3" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz#aadbe943464182a8922c3c927c3067ff40d24626" + resolved "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz" integrity sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg== dependencies: "@babel/template" "^7.3.3" @@ -1588,7 +1575,7 @@ babel-plugin-jest-hoist@^29.6.3: babel-preset-current-node-syntax@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz#b4399239b89b2a011f9ddbe3e4f401fc40cff73b" + resolved "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz" integrity sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ== dependencies: "@babel/plugin-syntax-async-generators" "^7.8.4" @@ -1606,7 +1593,7 @@ babel-preset-current-node-syntax@^1.0.0: babel-preset-jest@^29.6.3: version "29.6.3" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz#fa05fa510e7d493896d7b0dd2033601c840f171c" + resolved "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz" integrity sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA== dependencies: babel-plugin-jest-hoist "^29.6.3" @@ -1614,22 +1601,22 @@ babel-preset-jest@^29.6.3: bail@^2.0.0: version "2.0.2" - resolved "https://registry.yarnpkg.com/bail/-/bail-2.0.2.tgz#d26f5cd8fe5d6f832a31517b9f7c356040ba6d5d" + resolved "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz" integrity sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw== balanced-match@^1.0.0: version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== binary-extensions@^2.0.0: version "2.3.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" + resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz" integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== brace-expansion@^1.1.7: version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== dependencies: balanced-match "^1.0.0" @@ -1637,21 +1624,21 @@ brace-expansion@^1.1.7: brace-expansion@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz" integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== dependencies: balanced-match "^1.0.0" braces@^3.0.2, braces@~3.0.2: version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + resolved "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz" integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== dependencies: fill-range "^7.0.1" -browserslist@^4.22.2, browserslist@^4.23.0: +browserslist@^4.22.2, browserslist@^4.23.0, "browserslist@>= 4.21.0": version "4.23.0" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.0.tgz#8f3acc2bbe73af7213399430890f86c63a5674ab" + resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz" integrity sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ== dependencies: caniuse-lite "^1.0.30001587" @@ -1659,28 +1646,35 @@ browserslist@^4.22.2, browserslist@^4.23.0: node-releases "^2.0.14" update-browserslist-db "^1.0.13" +bs-logger@0.x: + version "0.2.6" + resolved "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz" + integrity sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog== + dependencies: + fast-json-stable-stringify "2.x" + bser@2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" + resolved "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz" integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== dependencies: node-int64 "^0.4.0" buffer-from@^1.0.0: version "1.1.2" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== busboy@1.6.0: version "1.6.0" - resolved "https://registry.yarnpkg.com/busboy/-/busboy-1.6.0.tgz#966ea36a9502e43cdb9146962523b92f531f6893" + resolved "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz" integrity sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA== dependencies: streamsearch "^1.1.0" call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7: version "1.0.7" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" + resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz" integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== dependencies: es-define-property "^1.0.0" @@ -1691,37 +1685,37 @@ call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7: callsites@^3.0.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== camelcase-css@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/camelcase-css/-/camelcase-css-2.0.1.tgz#ee978f6947914cc30c6b44741b6ed1df7f043fd5" + resolved "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz" integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== camelcase@^5.3.1: version "5.3.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + resolved "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== camelcase@^6.2.0: version "6.3.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" + resolved "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== caniuse-lite@^1.0.30001579, caniuse-lite@^1.0.30001587, caniuse-lite@^1.0.30001599: version "1.0.30001616" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001616.tgz#4342712750d35f71ebba9fcac65e2cf8870013c3" + resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001616.tgz" integrity sha512-RHVYKov7IcdNjVHJFNY/78RdG4oGVjbayxv8u5IO74Wv7Hlq4PnJE6mo/OjFijjVFNy5ijnCt6H3IIo4t+wfEw== ccount@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/ccount/-/ccount-2.0.1.tgz#17a3bf82302e0870d6da43a01311a8bc02a3ecf5" + resolved "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz" integrity sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg== chalk@^2.4.2: version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== dependencies: ansi-styles "^3.2.1" @@ -1730,7 +1724,7 @@ chalk@^2.4.2: chalk@^4.0.0: version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== dependencies: ansi-styles "^4.1.0" @@ -1738,27 +1732,27 @@ chalk@^4.0.0: char-regex@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" + resolved "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz" integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== character-entities-html4@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/character-entities-html4/-/character-entities-html4-2.1.0.tgz#1f1adb940c971a4b22ba39ddca6b618dc6e56b2b" + resolved "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz" integrity sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA== character-entities-legacy@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz#76bc83a90738901d7bc223a9e93759fdd560125b" + resolved "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz" integrity sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ== character-entities@^2.0.0: version "2.0.2" - resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-2.0.2.tgz#2d09c2e72cd9523076ccb21157dff66ad43fcc22" + resolved "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz" integrity sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ== chokidar@^3.5.3: version "3.6.0" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" + resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz" integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== dependencies: anymatch "~3.1.2" @@ -1773,107 +1767,107 @@ chokidar@^3.5.3: ci-info@^3.2.0: version "3.9.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" + resolved "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz" integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== cjs-module-lexer@^1.0.0: version "1.3.1" - resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.3.1.tgz#c485341ae8fd999ca4ee5af2d7a1c9ae01e0099c" + resolved "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.3.1.tgz" integrity sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q== class-variance-authority@^0.7.0: version "0.7.0" - resolved "https://registry.yarnpkg.com/class-variance-authority/-/class-variance-authority-0.7.0.tgz#1c3134d634d80271b1837452b06d821915954522" + resolved "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.0.tgz" integrity sha512-jFI8IQw4hczaL4ALINxqLEXQbWcNjoSkloa4IaufXCJr6QawJyw7tuRysRsrE8w2p/4gGaxKIt/hX3qz/IbD1A== dependencies: clsx "2.0.0" client-only@0.0.1: version "0.0.1" - resolved "https://registry.yarnpkg.com/client-only/-/client-only-0.0.1.tgz#38bba5d403c41ab150bff64a95c85013cf73bca1" + resolved "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz" integrity sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA== cliui@^8.0.1: version "8.0.1" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" + resolved "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz" integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== dependencies: string-width "^4.2.0" strip-ansi "^6.0.1" wrap-ansi "^7.0.0" +clsx@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz" + integrity sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA== + clsx@2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/clsx/-/clsx-2.0.0.tgz#12658f3fd98fafe62075595a5c30e43d18f3d00b" + resolved "https://registry.npmjs.org/clsx/-/clsx-2.0.0.tgz" integrity sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q== clsx@2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/clsx/-/clsx-2.1.0.tgz#e851283bcb5c80ee7608db18487433f7b23f77cb" + resolved "https://registry.npmjs.org/clsx/-/clsx-2.1.0.tgz" integrity sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg== -clsx@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/clsx/-/clsx-2.1.1.tgz#eed397c9fd8bd882bfb18deab7102049a2f32999" - integrity sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA== - co@^4.6.0: version "4.6.0" - resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + resolved "https://registry.npmjs.org/co/-/co-4.6.0.tgz" integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ== collect-v8-coverage@^1.0.0: version "1.0.2" - resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz#c0b29bcd33bcd0779a1344c2136051e6afd3d9e9" + resolved "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz" integrity sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q== color-convert@^1.9.0: version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== dependencies: color-name "1.1.3" color-convert@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== dependencies: color-name "~1.1.4" -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== - color-name@~1.1.4: version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + comma-separated-tokens@^2.0.0: version "2.0.3" - resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz#4e89c9458acb61bc8fef19f4529973b2392839ee" + resolved "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz" integrity sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg== commander@^4.0.0: version "4.1.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" + resolved "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz" integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== concat-map@0.0.1: version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== convert-source-map@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" + resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz" integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== create-jest@^29.7.0: version "29.7.0" - resolved "https://registry.yarnpkg.com/create-jest/-/create-jest-29.7.0.tgz#a355c5b3cb1e1af02ba177fe7afd7feee49a5320" + resolved "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz" integrity sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q== dependencies: "@jest/types" "^29.6.3" @@ -1886,12 +1880,12 @@ create-jest@^29.7.0: crelt@^1.0.0: version "1.0.6" - resolved "https://registry.yarnpkg.com/crelt/-/crelt-1.0.6.tgz#7cc898ea74e190fb6ef9dae57f8f81cf7302df72" + resolved "https://registry.npmjs.org/crelt/-/crelt-1.0.6.tgz" integrity sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g== cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== dependencies: path-key "^3.1.0" @@ -1900,22 +1894,22 @@ cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: cssesc@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" + resolved "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz" integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== csstype@^3.0.2: version "3.1.3" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81" + resolved "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz" integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== damerau-levenshtein@^1.0.8: version "1.0.8" - resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz#b43d286ccbd36bc5b2f7ed41caf2d0aba1f8a6e7" + resolved "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz" integrity sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA== data-view-buffer@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/data-view-buffer/-/data-view-buffer-1.0.1.tgz#8ea6326efec17a2e42620696e671d7d5a8bc66b2" + resolved "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz" integrity sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA== dependencies: call-bind "^1.0.6" @@ -1924,7 +1918,7 @@ data-view-buffer@^1.0.1: data-view-byte-length@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz#90721ca95ff280677eb793749fce1011347669e2" + resolved "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz" integrity sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ== dependencies: call-bind "^1.0.7" @@ -1933,7 +1927,7 @@ data-view-byte-length@^1.0.1: data-view-byte-offset@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz#5e0bbfb4828ed2d1b9b400cd8a7d119bca0ff18a" + resolved "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz" integrity sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA== dependencies: call-bind "^1.0.6" @@ -1942,43 +1936,43 @@ data-view-byte-offset@^1.0.0: debug@^3.2.7: version "3.2.7" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" + resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz" integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== dependencies: ms "^2.1.1" debug@^4.0.0, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: version "4.3.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== dependencies: ms "2.1.2" decode-named-character-reference@^1.0.0: version "1.0.2" - resolved "https://registry.yarnpkg.com/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz#daabac9690874c394c81e4162a0304b35d824f0e" + resolved "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz" integrity sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg== dependencies: character-entities "^2.0.0" dedent@^1.0.0: version "1.5.3" - resolved "https://registry.yarnpkg.com/dedent/-/dedent-1.5.3.tgz#99aee19eb9bae55a67327717b6e848d0bf777e5a" + resolved "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz" integrity sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ== deep-is@^0.1.3: version "0.1.4" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== deepmerge@^4.2.2: version "4.3.1" - resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" + resolved "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz" integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== define-data-property@^1.0.1, define-data-property@^1.1.4: version "1.1.4" - resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" + resolved "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz" integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== dependencies: es-define-property "^1.0.0" @@ -1987,7 +1981,7 @@ define-data-property@^1.0.1, define-data-property@^1.1.4: define-properties@^1.2.0, define-properties@^1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" + resolved "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz" integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== dependencies: define-data-property "^1.0.1" @@ -1996,88 +1990,88 @@ define-properties@^1.2.0, define-properties@^1.2.1: dequal@^2.0.0, dequal@^2.0.3: version "2.0.3" - resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" + resolved "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz" integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== detect-newline@^3.0.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" + resolved "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz" integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== detect-node-es@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/detect-node-es/-/detect-node-es-1.1.0.tgz#163acdf643330caa0b4cd7c21e7ee7755d6fa493" + resolved "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz" integrity sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ== didyoumean@^1.2.2: version "1.2.2" - resolved "https://registry.yarnpkg.com/didyoumean/-/didyoumean-1.2.2.tgz#989346ffe9e839b4555ecf5666edea0d3e8ad037" + resolved "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz" integrity sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw== diff-sequences@^29.6.3: version "29.6.3" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.6.3.tgz#4deaf894d11407c51efc8418012f9e70b84ea921" + resolved "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz" integrity sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q== diff@^5.0.0: version "5.2.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-5.2.0.tgz#26ded047cd1179b78b9537d5ef725503ce1ae531" + resolved "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz" integrity sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A== dir-glob@^3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + resolved "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz" integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== dependencies: path-type "^4.0.0" dlv@^1.1.3: version "1.1.3" - resolved "https://registry.yarnpkg.com/dlv/-/dlv-1.1.3.tgz#5c198a8a11453596e751494d49874bc7732f2e79" + resolved "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz" integrity sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA== doctrine@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + resolved "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz" integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== dependencies: esutils "^2.0.2" doctrine@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + resolved "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz" integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== dependencies: esutils "^2.0.2" eastasianwidth@^0.2.0: version "0.2.0" - resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" + resolved "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz" integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== electron-to-chromium@^1.4.668: version "1.4.757" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.757.tgz#45f7c9341b538f8c4b9ca8af9692e0ed1a776a44" + resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.757.tgz" integrity sha512-jftDaCknYSSt/+KKeXzH3LX5E2CvRLm75P3Hj+J/dv3CL0qUYcOt13d5FN1NiL5IJbbhzHrb3BomeG2tkSlZmw== emittery@^0.13.1: version "0.13.1" - resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.13.1.tgz#c04b8c3457490e0847ae51fced3af52d338e3dad" + resolved "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz" integrity sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ== emoji-regex@^8.0.0: version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== emoji-regex@^9.2.2: version "9.2.2" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz" integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== enhanced-resolve@^5.12.0: version "5.16.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.16.0.tgz#65ec88778083056cb32487faa9aef82ed0864787" + resolved "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.16.0.tgz" integrity sha512-O+QWCviPNSSLAD9Ucn8Awv+poAkqn3T1XY5/N7kR7rQO9yfSGWkYZDwpJ+iKF7B8rxaQKWngSqACpgzeapSyoA== dependencies: graceful-fs "^4.2.4" @@ -2085,19 +2079,19 @@ enhanced-resolve@^5.12.0: entities@^4.4.0: version "4.5.0" - resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" + resolved "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz" integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== error-ex@^1.3.1: version "1.3.2" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + resolved "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz" integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== dependencies: is-arrayish "^0.2.1" es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23.1, es-abstract@^1.23.2, es-abstract@^1.23.3: version "1.23.3" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.23.3.tgz#8f0c5a35cd215312573c5a27c87dfd6c881a0aa0" + resolved "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz" integrity sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A== dependencies: array-buffer-byte-length "^1.0.1" @@ -2149,19 +2143,19 @@ es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23 es-define-property@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845" + resolved "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz" integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ== dependencies: get-intrinsic "^1.2.4" es-errors@^1.1.0, es-errors@^1.2.1, es-errors@^1.3.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" + resolved "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz" integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== es-iterator-helpers@^1.0.15, es-iterator-helpers@^1.0.17: version "1.0.19" - resolved "https://registry.yarnpkg.com/es-iterator-helpers/-/es-iterator-helpers-1.0.19.tgz#117003d0e5fec237b4b5c08aded722e0c6d50ca8" + resolved "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.19.tgz" integrity sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw== dependencies: call-bind "^1.0.7" @@ -2181,14 +2175,14 @@ es-iterator-helpers@^1.0.15, es-iterator-helpers@^1.0.17: es-object-atoms@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.0.0.tgz#ddb55cd47ac2e240701260bc2a8e31ecb643d941" + resolved "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz" integrity sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw== dependencies: es-errors "^1.3.0" es-set-tostringtag@^2.0.3: version "2.0.3" - resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz#8bb60f0a440c2e4281962428438d58545af39777" + resolved "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz" integrity sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ== dependencies: get-intrinsic "^1.2.4" @@ -2197,14 +2191,14 @@ es-set-tostringtag@^2.0.3: es-shim-unscopables@^1.0.0, es-shim-unscopables@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz#1f6942e71ecc7835ed1c8a83006d8771a63a3763" + resolved "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz" integrity sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw== dependencies: hasown "^2.0.0" es-to-primitive@^1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + resolved "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz" integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== dependencies: is-callable "^1.1.4" @@ -2213,32 +2207,32 @@ es-to-primitive@^1.2.1: escalade@^3.1.1, escalade@^3.1.2: version "3.1.2" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.2.tgz#54076e9ab29ea5bf3d8f1ed62acffbb88272df27" + resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz" integrity sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA== escape-string-regexp@^1.0.5: version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== escape-string-regexp@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz" integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== escape-string-regexp@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== escape-string-regexp@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz#4683126b500b61762f2dbebace1806e8be31b1c8" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz" integrity sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw== eslint-config-next@14.2.3: version "14.2.3" - resolved "https://registry.yarnpkg.com/eslint-config-next/-/eslint-config-next-14.2.3.tgz#2fb0f7c4eccda530a4b5054438162b2303786d4f" + resolved "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-14.2.3.tgz" integrity sha512-ZkNztm3Q7hjqvB1rRlOX8P9E/cXRL9ajRcs8jufEtwMfTVYRqnmtnaSu57QqHyBlovMuiB8LEzfLBkh5RYV6Fg== dependencies: "@next/eslint-plugin-next" "14.2.3" @@ -2253,7 +2247,7 @@ eslint-config-next@14.2.3: eslint-import-resolver-node@^0.3.6, eslint-import-resolver-node@^0.3.9: version "0.3.9" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz#d4eaac52b8a2e7c3cd1903eb00f7e053356118ac" + resolved "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz" integrity sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g== dependencies: debug "^3.2.7" @@ -2262,7 +2256,7 @@ eslint-import-resolver-node@^0.3.6, eslint-import-resolver-node@^0.3.9: eslint-import-resolver-typescript@^3.5.2: version "3.6.1" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.1.tgz#7b983680edd3f1c5bce1a5829ae0bc2d57fe9efa" + resolved "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.1.tgz" integrity sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg== dependencies: debug "^4.3.4" @@ -2275,14 +2269,14 @@ eslint-import-resolver-typescript@^3.5.2: eslint-module-utils@^2.7.4, eslint-module-utils@^2.8.0: version "2.8.1" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz#52f2404300c3bd33deece9d7372fb337cc1d7c34" + resolved "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz" integrity sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q== dependencies: debug "^3.2.7" -eslint-plugin-import@^2.28.1: +eslint-plugin-import@*, eslint-plugin-import@^2.28.1: version "2.29.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz#d45b37b5ef5901d639c15270d74d46d161150643" + resolved "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz" integrity sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw== dependencies: array-includes "^3.1.7" @@ -2305,7 +2299,7 @@ eslint-plugin-import@^2.28.1: eslint-plugin-jsx-a11y@^6.7.1: version "6.8.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.8.0.tgz#2fa9c701d44fcd722b7c771ec322432857fcbad2" + resolved "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.8.0.tgz" integrity sha512-Hdh937BS3KdwwbBaKd5+PLCOmYY6U4f2h9Z2ktwtNKvIdIEu137rjYbcb9ApSbVJfWxANNuiKTD/9tOKjK9qOA== dependencies: "@babel/runtime" "^7.23.2" @@ -2327,7 +2321,7 @@ eslint-plugin-jsx-a11y@^6.7.1: eslint-plugin-prettier@^5.1.3: version "5.1.3" - resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-5.1.3.tgz#17cfade9e732cef32b5f5be53bd4e07afd8e67e1" + resolved "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.1.3.tgz" integrity sha512-C9GCVAs4Eq7ZC/XFQHITLiHJxQngdtraXaM+LoUFoFp/lHNl2Zn8f3WQbe9HvTBBQ9YnKFB0/2Ajdqwo5D1EAw== dependencies: prettier-linter-helpers "^1.0.0" @@ -2335,12 +2329,12 @@ eslint-plugin-prettier@^5.1.3: "eslint-plugin-react-hooks@^4.5.0 || 5.0.0-canary-7118f5dd7-20230705": version "4.6.2" - resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz#c829eb06c0e6f484b3fbb85a97e57784f328c596" + resolved "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz" integrity sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ== eslint-plugin-react@^7.33.2: version "7.34.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.34.1.tgz#6806b70c97796f5bbfb235a5d3379ece5f4da997" + resolved "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.34.1.tgz" integrity sha512-N97CxlouPT1AHt8Jn0mhhN2RrADlUAsk1/atcT2KyA/l9Q/E6ll7OIGwNumFmWfZ9skV3XXccYS19h80rHtgkw== dependencies: array-includes "^3.1.7" @@ -2364,7 +2358,7 @@ eslint-plugin-react@^7.33.2: eslint-scope@^7.2.2: version "7.2.2" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f" + resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz" integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== dependencies: esrecurse "^4.3.0" @@ -2372,12 +2366,12 @@ eslint-scope@^7.2.2: eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: version "3.4.3" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" + resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz" integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== -eslint@^8: +eslint@*, "eslint@^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8", "eslint@^3 || ^4 || ^5 || ^6 || ^7 || ^8", "eslint@^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0", "eslint@^6.0.0 || ^7.0.0 || >=8.0.0", "eslint@^7.23.0 || ^8.0.0", eslint@^8, eslint@^8.56.0, eslint@>=8.0.0: version "8.57.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.0.tgz#c786a6fd0e0b68941aaf624596fb987089195668" + resolved "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz" integrity sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ== dependencies: "@eslint-community/eslint-utils" "^4.2.0" @@ -2421,7 +2415,7 @@ eslint@^8: espree@^9.6.0, espree@^9.6.1: version "9.6.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" + resolved "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz" integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== dependencies: acorn "^8.9.0" @@ -2430,36 +2424,36 @@ espree@^9.6.0, espree@^9.6.1: esprima@^4.0.0: version "4.0.1" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== esquery@^1.4.2: version "1.5.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" + resolved "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz" integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== dependencies: estraverse "^5.1.0" esrecurse@^4.3.0: version "4.3.0" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz" integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== dependencies: estraverse "^5.2.0" estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0: version "5.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== esutils@^2.0.2: version "2.0.3" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== execa@^5.0.0: version "5.1.1" - resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" + resolved "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz" integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== dependencies: cross-spawn "^7.0.3" @@ -2474,12 +2468,12 @@ execa@^5.0.0: exit@^0.1.2: version "0.1.2" - resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" + resolved "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz" integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== -expect@^29.7.0: +expect@^29.0.0, expect@^29.7.0: version "29.7.0" - resolved "https://registry.yarnpkg.com/expect/-/expect-29.7.0.tgz#578874590dcb3214514084c08115d8aee61e11bc" + resolved "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz" integrity sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw== dependencies: "@jest/expect-utils" "^29.7.0" @@ -2490,22 +2484,22 @@ expect@^29.7.0: extend@^3.0.0: version "3.0.2" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + resolved "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz" integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== fast-diff@^1.1.2: version "1.3.0" - resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.3.0.tgz#ece407fa550a64d638536cd727e129c61616e0f0" + resolved "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz" integrity sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw== fast-glob@^3.2.9, fast-glob@^3.3.0, fast-glob@^3.3.1: version "3.3.2" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" + resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz" integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== dependencies: "@nodelib/fs.stat" "^2.0.2" @@ -2514,47 +2508,47 @@ fast-glob@^3.2.9, fast-glob@^3.3.0, fast-glob@^3.3.1: merge2 "^1.3.0" micromatch "^4.0.4" -fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0: +fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0, fast-json-stable-stringify@2.x: version "2.1.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== fast-levenshtein@^2.0.6: version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== fastq@^1.6.0: version "1.17.1" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.17.1.tgz#2a523f07a4e7b1e81a42b91b8bf2254107753b47" + resolved "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz" integrity sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w== dependencies: reusify "^1.0.4" fb-watchman@^2.0.0: version "2.0.2" - resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.2.tgz#e9524ee6b5c77e9e5001af0f85f3adbb8623255c" + resolved "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz" integrity sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA== dependencies: bser "2.1.1" file-entry-cache@^6.0.1: version "6.0.1" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" + resolved "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz" integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== dependencies: flat-cache "^3.0.4" fill-range@^7.0.1: version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== dependencies: to-regex-range "^5.0.1" find-up@^4.0.0, find-up@^4.1.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + resolved "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz" integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== dependencies: locate-path "^5.0.0" @@ -2562,7 +2556,7 @@ find-up@^4.0.0, find-up@^4.1.0: find-up@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz" integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== dependencies: locate-path "^6.0.0" @@ -2570,7 +2564,7 @@ find-up@^5.0.0: flat-cache@^3.0.4: version "3.2.0" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.2.0.tgz#2c0c2d5040c99b1632771a9d105725c0115363ee" + resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz" integrity sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw== dependencies: flatted "^3.2.9" @@ -2579,19 +2573,19 @@ flat-cache@^3.0.4: flatted@^3.2.9: version "3.3.1" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.1.tgz#21db470729a6734d4997002f439cb308987f567a" + resolved "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz" integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw== for-each@^0.3.3: version "0.3.3" - resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" + resolved "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz" integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== dependencies: is-callable "^1.1.3" foreground-child@^3.1.0: version "3.1.1" - resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.1.1.tgz#1d173e776d75d2772fed08efe4a0de1ea1b12d0d" + resolved "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz" integrity sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg== dependencies: cross-spawn "^7.0.0" @@ -2599,27 +2593,27 @@ foreground-child@^3.1.0: fraction.js@^4.3.7: version "4.3.7" - resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.3.7.tgz#06ca0085157e42fda7f9e726e79fefc4068840f7" + resolved "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz" integrity sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew== fs.realpath@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== fsevents@^2.3.2, fsevents@~2.3.2: version "2.3.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz" integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== function-bind@^1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz" integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== function.prototype.name@^1.1.5, function.prototype.name@^1.1.6: version "1.1.6" - resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.6.tgz#cdf315b7d90ee77a4c6ee216c3c3362da07533fd" + resolved "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz" integrity sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg== dependencies: call-bind "^1.0.2" @@ -2629,22 +2623,22 @@ function.prototype.name@^1.1.5, function.prototype.name@^1.1.6: functions-have-names@^1.2.3: version "1.2.3" - resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" + resolved "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz" integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== gensync@^1.0.0-beta.2: version "1.0.0-beta.2" - resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + resolved "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz" integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== get-caller-file@^2.0.5: version "2.0.5" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4: version "1.2.4" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" + resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz" integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== dependencies: es-errors "^1.3.0" @@ -2655,22 +2649,22 @@ get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.3, get-intrinsic@ get-nonce@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/get-nonce/-/get-nonce-1.0.1.tgz#fdf3f0278073820d2ce9426c18f07481b1e0cdf3" + resolved "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz" integrity sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q== get-package-type@^0.1.0: version "0.1.0" - resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" + resolved "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz" integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== get-stream@^6.0.0: version "6.0.1" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + resolved "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz" integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== get-symbol-description@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.2.tgz#533744d5aa20aca4e079c8e5daf7fd44202821f5" + resolved "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz" integrity sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg== dependencies: call-bind "^1.0.5" @@ -2679,39 +2673,28 @@ get-symbol-description@^1.0.2: get-tsconfig@^4.5.0: version "4.7.4" - resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.7.4.tgz#228e1a3e37125aeb4467e9b992b92c4533093bd2" + resolved "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.4.tgz" integrity sha512-ofbkKj+0pjXjhejr007J/fLf+sW+8H7K5GCm+msC8q3IpvgjobpyPqSRFemNyIMxklC0zeJpi7VDFna19FacvQ== dependencies: resolve-pkg-maps "^1.0.0" glob-parent@^5.1.2, glob-parent@~5.1.2: version "5.1.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== dependencies: is-glob "^4.0.1" glob-parent@^6.0.2: version "6.0.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz" integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== dependencies: is-glob "^4.0.3" -glob@10.3.10: - version "10.3.10" - resolved "https://registry.yarnpkg.com/glob/-/glob-10.3.10.tgz#0351ebb809fd187fe421ab96af83d3a70715df4b" - integrity sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g== - dependencies: - foreground-child "^3.1.0" - jackspeak "^2.3.5" - minimatch "^9.0.1" - minipass "^5.0.0 || ^6.0.2 || ^7.0.0" - path-scurry "^1.10.1" - glob@^10.3.10: version "10.3.12" - resolved "https://registry.yarnpkg.com/glob/-/glob-10.3.12.tgz#3a65c363c2e9998d220338e88a5f6ac97302960b" + resolved "https://registry.npmjs.org/glob/-/glob-10.3.12.tgz" integrity sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg== dependencies: foreground-child "^3.1.0" @@ -2722,7 +2705,7 @@ glob@^10.3.10: glob@^7.1.3, glob@^7.1.4: version "7.2.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== dependencies: fs.realpath "^1.0.0" @@ -2732,21 +2715,32 @@ glob@^7.1.3, glob@^7.1.4: once "^1.3.0" path-is-absolute "^1.0.0" +glob@10.3.10: + version "10.3.10" + resolved "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz" + integrity sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g== + dependencies: + foreground-child "^3.1.0" + jackspeak "^2.3.5" + minimatch "^9.0.1" + minipass "^5.0.0 || ^6.0.2 || ^7.0.0" + path-scurry "^1.10.1" + globals@^11.1.0: version "11.12.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + resolved "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== globals@^13.19.0: version "13.24.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.24.0.tgz#8432a19d78ce0c1e833949c36adb345400bb1171" + resolved "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz" integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ== dependencies: type-fest "^0.20.2" globalthis@^1.0.3: version "1.0.4" - resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.4.tgz#7430ed3a975d97bfb59bcce41f5cabbafa651236" + resolved "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz" integrity sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ== dependencies: define-properties "^1.2.1" @@ -2754,7 +2748,7 @@ globalthis@^1.0.3: globby@^11.1.0: version "11.1.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" + resolved "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz" integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== dependencies: array-union "^2.1.0" @@ -2766,77 +2760,77 @@ globby@^11.1.0: gopd@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" + resolved "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz" integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== dependencies: get-intrinsic "^1.1.3" graceful-fs@^4.2.11, graceful-fs@^4.2.4, graceful-fs@^4.2.9: version "4.2.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== graphemer@^1.4.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" + resolved "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz" integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== has-bigints@^1.0.1, has-bigints@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" + resolved "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz" integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== has-flag@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== has-flag@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" + resolved "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz" integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== dependencies: es-define-property "^1.0.0" has-proto@^1.0.1, has-proto@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.3.tgz#b31ddfe9b0e6e9914536a6ab286426d0214f77fd" + resolved "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz" integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q== has-symbols@^1.0.2, has-symbols@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz" integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== has-tostringtag@^1.0.0, has-tostringtag@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" + resolved "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz" integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== dependencies: has-symbols "^1.0.3" hasown@^2.0.0, hasown@^2.0.1, hasown@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" + resolved "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz" integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== dependencies: function-bind "^1.1.2" hast-util-embedded@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/hast-util-embedded/-/hast-util-embedded-2.0.1.tgz#979e07ecc6bc42b560ccac755cab926c354f24c7" + resolved "https://registry.npmjs.org/hast-util-embedded/-/hast-util-embedded-2.0.1.tgz" integrity sha512-QUdSOP1/o+/TxXtpPFXR2mUg2P+ySrmlX7QjwHZCXqMFyYk7YmcGSvqRW+4XgXAoHifdE1t2PwFaQK33TqVjSw== dependencies: hast-util-is-element "^2.0.0" hast-util-embedded@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/hast-util-embedded/-/hast-util-embedded-3.0.0.tgz#be4477780fbbe079cdba22982e357a0de4ba853e" + resolved "https://registry.npmjs.org/hast-util-embedded/-/hast-util-embedded-3.0.0.tgz" integrity sha512-naH8sld4Pe2ep03qqULEtvYr7EjrLK2QHY8KJR6RJkTUjPGObe1vnx585uzem2hGra+s1q08DZZpfgDVYRbaXA== dependencies: "@types/hast" "^3.0.0" @@ -2844,7 +2838,7 @@ hast-util-embedded@^3.0.0: hast-util-from-dom@^4.2.0: version "4.2.0" - resolved "https://registry.yarnpkg.com/hast-util-from-dom/-/hast-util-from-dom-4.2.0.tgz#25836ddecc3cc0849d32749c2a7aec03e94b59a7" + resolved "https://registry.npmjs.org/hast-util-from-dom/-/hast-util-from-dom-4.2.0.tgz" integrity sha512-t1RJW/OpJbCAJQeKi3Qrj1cAOLA0+av/iPFori112+0X7R3wng+jxLA+kXec8K4szqPRGI8vPxbbpEYvvpwaeQ== dependencies: hastscript "^7.0.0" @@ -2852,7 +2846,7 @@ hast-util-from-dom@^4.2.0: hast-util-from-parse5@^7.0.0: version "7.1.2" - resolved "https://registry.yarnpkg.com/hast-util-from-parse5/-/hast-util-from-parse5-7.1.2.tgz#aecfef73e3ceafdfa4550716443e4eb7b02e22b0" + resolved "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-7.1.2.tgz" integrity sha512-Nz7FfPBuljzsN3tCQ4kCBKqdNhQE2l0Tn+X1ubgKBPRoiDIu1mL08Cfw4k7q71+Duyaw7DXDN+VTAp4Vh3oCOw== dependencies: "@types/hast" "^2.0.0" @@ -2865,19 +2859,19 @@ hast-util-from-parse5@^7.0.0: hast-util-has-property@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/hast-util-has-property/-/hast-util-has-property-2.0.1.tgz#8ec99c3e8f02626304ee438cdb9f0528b017e083" + resolved "https://registry.npmjs.org/hast-util-has-property/-/hast-util-has-property-2.0.1.tgz" integrity sha512-X2+RwZIMTMKpXUzlotatPzWj8bspCymtXH3cfG3iQKV+wPF53Vgaqxi/eLqGck0wKq1kS9nvoB1wchbCPEL8sg== hast-util-has-property@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/hast-util-has-property/-/hast-util-has-property-3.0.0.tgz#4e595e3cddb8ce530ea92f6fc4111a818d8e7f93" + resolved "https://registry.npmjs.org/hast-util-has-property/-/hast-util-has-property-3.0.0.tgz" integrity sha512-MNilsvEKLFpV604hwfhVStK0usFY/QmM5zX16bo7EjnAEGofr5YyI37kzopBlZJkHD4t887i+q/C8/tr5Q94cA== dependencies: "@types/hast" "^3.0.0" hast-util-is-body-ok-link@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/hast-util-is-body-ok-link/-/hast-util-is-body-ok-link-2.0.0.tgz#e0df6947b2676d2acac55c611755d359f264958e" + resolved "https://registry.npmjs.org/hast-util-is-body-ok-link/-/hast-util-is-body-ok-link-2.0.0.tgz" integrity sha512-S58hCexyKdD31vMsErvgLfflW6vYWo/ixRLPJTtkOvLld24vyI8vmYmkgLA5LG3la2ME7nm7dLGdm48gfLRBfw== dependencies: "@types/hast" "^2.0.0" @@ -2886,14 +2880,14 @@ hast-util-is-body-ok-link@^2.0.0: hast-util-is-body-ok-link@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/hast-util-is-body-ok-link/-/hast-util-is-body-ok-link-3.0.0.tgz#6b2d808813a6f73eb20e61bdd2b203591af85eb4" + resolved "https://registry.npmjs.org/hast-util-is-body-ok-link/-/hast-util-is-body-ok-link-3.0.0.tgz" integrity sha512-VFHY5bo2nY8HiV6nir2ynmEB1XkxzuUffhEGeVx7orbu/B1KaGyeGgMZldvMVx5xWrDlLLG/kQ6YkJAMkBEx0w== dependencies: "@types/hast" "^3.0.0" hast-util-is-element@^2.0.0: version "2.1.3" - resolved "https://registry.yarnpkg.com/hast-util-is-element/-/hast-util-is-element-2.1.3.tgz#cd3279cfefb70da6d45496068f020742256fc471" + resolved "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-2.1.3.tgz" integrity sha512-O1bKah6mhgEq2WtVMk+Ta5K7pPMqsBBlmzysLdcwKVrqzZQ0CHqUPiIVspNhAG1rvxpvJjtGee17XfauZYKqVA== dependencies: "@types/hast" "^2.0.0" @@ -2901,21 +2895,21 @@ hast-util-is-element@^2.0.0: hast-util-is-element@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/hast-util-is-element/-/hast-util-is-element-3.0.0.tgz#6e31a6532c217e5b533848c7e52c9d9369ca0932" + resolved "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-3.0.0.tgz" integrity sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g== dependencies: "@types/hast" "^3.0.0" hast-util-parse-selector@^3.0.0: version "3.1.1" - resolved "https://registry.yarnpkg.com/hast-util-parse-selector/-/hast-util-parse-selector-3.1.1.tgz#25ab00ae9e75cbc62cf7a901f68a247eade659e2" + resolved "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-3.1.1.tgz" integrity sha512-jdlwBjEexy1oGz0aJ2f4GKMaVKkA9jwjr4MjAAI22E5fM/TXVZHuS5OpONtdeIkRKqAaryQ2E9xNQxijoThSZA== dependencies: "@types/hast" "^2.0.0" hast-util-phrasing@^2.0.0: version "2.0.2" - resolved "https://registry.yarnpkg.com/hast-util-phrasing/-/hast-util-phrasing-2.0.2.tgz#0747ba8000a8d5598bef4000819d92fda8f8843c" + resolved "https://registry.npmjs.org/hast-util-phrasing/-/hast-util-phrasing-2.0.2.tgz" integrity sha512-yGkCfPkkfCyiLfK6KEl/orMDr/zgCnq/NaO9HfULx6/Zga5fso5eqQA5Ov/JZVqACygvw9shRYWgXNcG2ilo7w== dependencies: "@types/hast" "^2.0.0" @@ -2926,7 +2920,7 @@ hast-util-phrasing@^2.0.0: hast-util-phrasing@^3.0.0: version "3.0.1" - resolved "https://registry.yarnpkg.com/hast-util-phrasing/-/hast-util-phrasing-3.0.1.tgz#fa284c0cd4a82a0dd6020de8300a7b1ebffa1690" + resolved "https://registry.npmjs.org/hast-util-phrasing/-/hast-util-phrasing-3.0.1.tgz" integrity sha512-6h60VfI3uBQUxHqTyMymMZnEbNl1XmEGtOxxKYL7stY2o601COo62AWAYBQR9lZbYXYSBoxag8UpPRXK+9fqSQ== dependencies: "@types/hast" "^3.0.0" @@ -2937,7 +2931,7 @@ hast-util-phrasing@^3.0.0: hast-util-raw@^7.0.0: version "7.2.3" - resolved "https://registry.yarnpkg.com/hast-util-raw/-/hast-util-raw-7.2.3.tgz#dcb5b22a22073436dbdc4aa09660a644f4991d99" + resolved "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-7.2.3.tgz" integrity sha512-RujVQfVsOrxzPOPSzZFiwofMArbQke6DJjnFfceiEbFh7S05CbPt0cYN+A5YeD3pso0JQk6O1aHBnx9+Pm2uqg== dependencies: "@types/hast" "^2.0.0" @@ -2954,7 +2948,7 @@ hast-util-raw@^7.0.0: hast-util-to-html@^8.0.0: version "8.0.4" - resolved "https://registry.yarnpkg.com/hast-util-to-html/-/hast-util-to-html-8.0.4.tgz#0269ef33fa3f6599b260a8dc94f733b8e39e41fc" + resolved "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-8.0.4.tgz" integrity sha512-4tpQTUOr9BMjtYyNlt0P50mH7xj0Ks2xpo8M943Vykljf99HW6EzulIoJP1N3eKOSScEHzyzi9dm7/cn0RfGwA== dependencies: "@types/hast" "^2.0.0" @@ -2971,7 +2965,7 @@ hast-util-to-html@^8.0.0: hast-util-to-mdast@^8.3.0: version "8.4.1" - resolved "https://registry.yarnpkg.com/hast-util-to-mdast/-/hast-util-to-mdast-8.4.1.tgz#f953027e0688c52439b11a433ab9ed8b43e1e17b" + resolved "https://registry.npmjs.org/hast-util-to-mdast/-/hast-util-to-mdast-8.4.1.tgz" integrity sha512-tfmBLASuCgyhCzpkTXM5kU8xeuS5jkMZ17BYm2YftGT5wvgc7uHXTZ/X8WfNd6F5NV/IGmrLsuahZ+jXQir4zQ== dependencies: "@types/extend" "^3.0.0" @@ -2992,7 +2986,7 @@ hast-util-to-mdast@^8.3.0: hast-util-to-parse5@^7.0.0: version "7.1.0" - resolved "https://registry.yarnpkg.com/hast-util-to-parse5/-/hast-util-to-parse5-7.1.0.tgz#c49391bf8f151973e0c9adcd116b561e8daf29f3" + resolved "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-7.1.0.tgz" integrity sha512-YNRgAJkH2Jky5ySkIqFXTQiaqcAtJyVE+D5lkN6CdtOqrnkLfGYYrEcKuHOJZlp+MwjSwuD3fZuawI+sic/RBw== dependencies: "@types/hast" "^2.0.0" @@ -3004,7 +2998,7 @@ hast-util-to-parse5@^7.0.0: hast-util-to-text@^3.0.0: version "3.1.2" - resolved "https://registry.yarnpkg.com/hast-util-to-text/-/hast-util-to-text-3.1.2.tgz#ecf30c47141f41e91a5d32d0b1e1859fd2ac04f2" + resolved "https://registry.npmjs.org/hast-util-to-text/-/hast-util-to-text-3.1.2.tgz" integrity sha512-tcllLfp23dJJ+ju5wCCZHVpzsQQ43+moJbqVX3jNWPB7z/KFC4FyZD6R7y94cHL6MQ33YtMZL8Z0aIXXI4XFTw== dependencies: "@types/hast" "^2.0.0" @@ -3014,19 +3008,19 @@ hast-util-to-text@^3.0.0: hast-util-whitespace@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/hast-util-whitespace/-/hast-util-whitespace-2.0.1.tgz#0ec64e257e6fc216c7d14c8a1b74d27d650b4557" + resolved "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-2.0.1.tgz" integrity sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng== hast-util-whitespace@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz#7778ed9d3c92dd9e8c5c8f648a49c21fc51cb621" + resolved "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz" integrity sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw== dependencies: "@types/hast" "^3.0.0" hastscript@^7.0.0: version "7.2.0" - resolved "https://registry.yarnpkg.com/hastscript/-/hastscript-7.2.0.tgz#0eafb7afb153d047077fa2a833dc9b7ec604d10b" + resolved "https://registry.npmjs.org/hastscript/-/hastscript-7.2.0.tgz" integrity sha512-TtYPq24IldU8iKoJQqvZOuhi5CyCQRAbvDOX0x1eW6rsHSxa/1i2CCiptNTotGHJ3VoHRGmqiv6/D3q113ikkw== dependencies: "@types/hast" "^2.0.0" @@ -3037,37 +3031,37 @@ hastscript@^7.0.0: html-escaper@^2.0.0: version "2.0.2" - resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" + resolved "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz" integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== html-void-elements@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/html-void-elements/-/html-void-elements-2.0.1.tgz#29459b8b05c200b6c5ee98743c41b979d577549f" + resolved "https://registry.npmjs.org/html-void-elements/-/html-void-elements-2.0.1.tgz" integrity sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A== html-whitespace-sensitive-tag-names@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/html-whitespace-sensitive-tag-names/-/html-whitespace-sensitive-tag-names-3.0.0.tgz#c7c8c11d93c014fba642e240d7f3da39656ab301" + resolved "https://registry.npmjs.org/html-whitespace-sensitive-tag-names/-/html-whitespace-sensitive-tag-names-3.0.0.tgz" integrity sha512-KlClZ3/Qy5UgvpvVvDomGhnQhNWH5INE8GwvSIQ9CWt1K0zbbXrl7eN5bWaafOZgtmO3jMPwUqmrmEwinhPq1w== human-signals@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" + resolved "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz" integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== ignore@^5.2.0: version "5.3.1" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.1.tgz#5073e554cd42c5b33b394375f538b8593e34d4ef" + resolved "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz" integrity sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw== immer@^10.0.3: version "10.1.1" - resolved "https://registry.yarnpkg.com/immer/-/immer-10.1.1.tgz#206f344ea372d8ea176891545ee53ccc062db7bc" + resolved "https://registry.npmjs.org/immer/-/immer-10.1.1.tgz" integrity sha512-s2MPrmjovJcoMaHtx6K11Ra7oD05NT97w1IC5zpMkT6Atjr7H8LjaDd81iIxUYpMKSRRNMJE703M1Fhr/TctHw== import-fresh@^3.2.1: version "3.3.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz" integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== dependencies: parent-module "^1.0.0" @@ -3075,7 +3069,7 @@ import-fresh@^3.2.1: import-local@^3.0.2: version "3.1.0" - resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4" + resolved "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz" integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== dependencies: pkg-dir "^4.2.0" @@ -3083,12 +3077,12 @@ import-local@^3.0.2: imurmurhash@^0.1.4: version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== inflight@^1.0.4: version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== dependencies: once "^1.3.0" @@ -3096,12 +3090,12 @@ inflight@^1.0.4: inherits@2: version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== internal-slot@^1.0.7: version "1.0.7" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.7.tgz#c06dcca3ed874249881007b0a5523b172a190802" + resolved "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz" integrity sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g== dependencies: es-errors "^1.3.0" @@ -3110,14 +3104,14 @@ internal-slot@^1.0.7: invariant@^2.2.4: version "2.2.4" - resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + resolved "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz" integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== dependencies: loose-envify "^1.0.0" is-array-buffer@^3.0.4: version "3.0.4" - resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.4.tgz#7a1f92b3d61edd2bc65d24f130530ea93d7fae98" + resolved "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz" integrity sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw== dependencies: call-bind "^1.0.2" @@ -3125,33 +3119,33 @@ is-array-buffer@^3.0.4: is-arrayish@^0.2.1: version "0.2.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz" integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== is-async-function@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/is-async-function/-/is-async-function-2.0.0.tgz#8e4418efd3e5d3a6ebb0164c05ef5afb69aa9646" + resolved "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz" integrity sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA== dependencies: has-tostringtag "^1.0.0" is-bigint@^1.0.1: version "1.0.4" - resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" + resolved "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz" integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== dependencies: has-bigints "^1.0.1" is-binary-path@~2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz" integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== dependencies: binary-extensions "^2.0.0" is-boolean-object@^1.1.0: version "1.1.2" - resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" + resolved "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz" integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== dependencies: call-bind "^1.0.2" @@ -3159,106 +3153,106 @@ is-boolean-object@^1.1.0: is-buffer@^2.0.0: version "2.0.5" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" + resolved "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz" integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: version "1.2.7" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" + resolved "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz" integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== is-core-module@^2.11.0, is-core-module@^2.13.0, is-core-module@^2.13.1: version "2.13.1" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384" + resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz" integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw== dependencies: hasown "^2.0.0" is-data-view@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/is-data-view/-/is-data-view-1.0.1.tgz#4b4d3a511b70f3dc26d42c03ca9ca515d847759f" + resolved "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz" integrity sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w== dependencies: is-typed-array "^1.1.13" is-date-object@^1.0.1, is-date-object@^1.0.5: version "1.0.5" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" + resolved "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz" integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== dependencies: has-tostringtag "^1.0.0" is-extglob@^2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== is-finalizationregistry@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz#c8749b65f17c133313e661b1289b95ad3dbd62e6" + resolved "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz" integrity sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw== dependencies: call-bind "^1.0.2" is-fullwidth-code-point@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== is-generator-fn@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" + resolved "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz" integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== is-generator-function@^1.0.10: version "1.0.10" - resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" + resolved "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz" integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== dependencies: has-tostringtag "^1.0.0" is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: version "4.0.3" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== dependencies: is-extglob "^2.1.1" is-map@^2.0.3: version "2.0.3" - resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.3.tgz#ede96b7fe1e270b3c4465e3a465658764926d62e" + resolved "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz" integrity sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw== is-negative-zero@^2.0.3: version "2.0.3" - resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.3.tgz#ced903a027aca6381b777a5743069d7376a49747" + resolved "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz" integrity sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw== is-number-object@^1.0.4: version "1.0.7" - resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" + resolved "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz" integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== dependencies: has-tostringtag "^1.0.0" is-number@^7.0.0: version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== is-path-inside@^3.0.3: version "3.0.3" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" + resolved "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz" integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== is-plain-obj@^4.0.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-4.1.0.tgz#d65025edec3657ce032fd7db63c97883eaed71f0" + resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz" integrity sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg== is-regex@^1.1.4: version "1.1.4" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" + resolved "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz" integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== dependencies: call-bind "^1.0.2" @@ -3266,57 +3260,57 @@ is-regex@^1.1.4: is-set@^2.0.3: version "2.0.3" - resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.3.tgz#8ab209ea424608141372ded6e0cb200ef1d9d01d" + resolved "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz" integrity sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg== is-shared-array-buffer@^1.0.2, is-shared-array-buffer@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz#1237f1cba059cdb62431d378dcc37d9680181688" + resolved "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz" integrity sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg== dependencies: call-bind "^1.0.7" is-stream@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + resolved "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz" integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== is-string@^1.0.5, is-string@^1.0.7: version "1.0.7" - resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" + resolved "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz" integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== dependencies: has-tostringtag "^1.0.0" is-symbol@^1.0.2, is-symbol@^1.0.3: version "1.0.4" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" + resolved "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz" integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== dependencies: has-symbols "^1.0.2" is-typed-array@^1.1.13: version "1.1.13" - resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.13.tgz#d6c5ca56df62334959322d7d7dd1cca50debe229" + resolved "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz" integrity sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw== dependencies: which-typed-array "^1.1.14" is-weakmap@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.2.tgz#bf72615d649dfe5f699079c54b83e47d1ae19cfd" + resolved "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz" integrity sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w== is-weakref@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" + resolved "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz" integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== dependencies: call-bind "^1.0.2" is-weakset@^2.0.3: version "2.0.3" - resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.3.tgz#e801519df8c0c43e12ff2834eead84ec9e624007" + resolved "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz" integrity sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ== dependencies: call-bind "^1.0.7" @@ -3324,27 +3318,27 @@ is-weakset@^2.0.3: isarray@^2.0.5: version "2.0.5" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" + resolved "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz" integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== isexe@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== isomorphic.js@^0.2.4: version "0.2.5" - resolved "https://registry.yarnpkg.com/isomorphic.js/-/isomorphic.js-0.2.5.tgz#13eecf36f2dba53e85d355e11bf9d4208c6f7f88" + resolved "https://registry.npmjs.org/isomorphic.js/-/isomorphic.js-0.2.5.tgz" integrity sha512-PIeMbHqMt4DnUP3MA/Flc0HElYjMXArsw1qwJZcm9sqR8mq3l8NYizFMty0pWwE/tzIGH3EKK5+jes5mAr85yw== istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: version "3.2.2" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz#2d166c4b0644d43a39f04bf6c2edd1e585f31756" + resolved "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz" integrity sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg== istanbul-lib-instrument@^5.0.4: version "5.2.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz#d10c8885c2125574e1c231cacadf955675e1ce3d" + resolved "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz" integrity sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg== dependencies: "@babel/core" "^7.12.3" @@ -3355,7 +3349,7 @@ istanbul-lib-instrument@^5.0.4: istanbul-lib-instrument@^6.0.0: version "6.0.2" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.2.tgz#91655936cf7380e4e473383081e38478b69993b1" + resolved "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.2.tgz" integrity sha512-1WUsZ9R1lA0HtBSohTkm39WTPlNKSJ5iFk7UwqXkBLoHQT+hfqPsfsTDVuZdKGaBwn7din9bS7SsnoAr943hvw== dependencies: "@babel/core" "^7.23.9" @@ -3366,7 +3360,7 @@ istanbul-lib-instrument@^6.0.0: istanbul-lib-report@^3.0.0: version "3.0.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz#908305bac9a5bd175ac6a74489eafd0fc2445a7d" + resolved "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz" integrity sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw== dependencies: istanbul-lib-coverage "^3.0.0" @@ -3375,7 +3369,7 @@ istanbul-lib-report@^3.0.0: istanbul-lib-source-maps@^4.0.0: version "4.0.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz#895f3a709fcfba34c6de5a42939022f3e4358551" + resolved "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz" integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== dependencies: debug "^4.1.1" @@ -3384,7 +3378,7 @@ istanbul-lib-source-maps@^4.0.0: istanbul-reports@^3.1.3: version "3.1.7" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.7.tgz#daed12b9e1dca518e15c056e1e537e741280fa0b" + resolved "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz" integrity sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g== dependencies: html-escaper "^2.0.0" @@ -3392,7 +3386,7 @@ istanbul-reports@^3.1.3: iterator.prototype@^1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/iterator.prototype/-/iterator.prototype-1.1.2.tgz#5e29c8924f01916cb9335f1ff80619dcff22b0c0" + resolved "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz" integrity sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w== dependencies: define-properties "^1.2.1" @@ -3403,7 +3397,7 @@ iterator.prototype@^1.1.2: jackspeak@^2.3.5, jackspeak@^2.3.6: version "2.3.6" - resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-2.3.6.tgz#647ecc472238aee4b06ac0e461acc21a8c505ca8" + resolved "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz" integrity sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ== dependencies: "@isaacs/cliui" "^8.0.2" @@ -3412,12 +3406,12 @@ jackspeak@^2.3.5, jackspeak@^2.3.6: javascript-natural-sort@0.7.1: version "0.7.1" - resolved "https://registry.yarnpkg.com/javascript-natural-sort/-/javascript-natural-sort-0.7.1.tgz#f9e2303d4507f6d74355a73664d1440fb5a0ef59" + resolved "https://registry.npmjs.org/javascript-natural-sort/-/javascript-natural-sort-0.7.1.tgz" integrity sha512-nO6jcEfZWQXDhOiBtG2KvKyEptz7RVbpGP4vTD2hLBdmNQSsCiicO2Ioinv6UI4y9ukqnBpy+XZ9H6uLNgJTlw== jest-changed-files@^29.7.0: version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-29.7.0.tgz#1c06d07e77c78e1585d020424dedc10d6e17ac3a" + resolved "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz" integrity sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w== dependencies: execa "^5.0.0" @@ -3426,7 +3420,7 @@ jest-changed-files@^29.7.0: jest-circus@^29.7.0: version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-29.7.0.tgz#b6817a45fcc835d8b16d5962d0c026473ee3668a" + resolved "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz" integrity sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw== dependencies: "@jest/environment" "^29.7.0" @@ -3452,7 +3446,7 @@ jest-circus@^29.7.0: jest-cli@^29.7.0: version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-29.7.0.tgz#5592c940798e0cae677eec169264f2d839a37995" + resolved "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz" integrity sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg== dependencies: "@jest/core" "^29.7.0" @@ -3469,7 +3463,7 @@ jest-cli@^29.7.0: jest-config@^29.7.0: version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-29.7.0.tgz#bcbda8806dbcc01b1e316a46bb74085a84b0245f" + resolved "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz" integrity sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ== dependencies: "@babel/core" "^7.11.6" @@ -3497,7 +3491,7 @@ jest-config@^29.7.0: jest-diff@^29.7.0: version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.7.0.tgz#017934a66ebb7ecf6f205e84699be10afd70458a" + resolved "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz" integrity sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw== dependencies: chalk "^4.0.0" @@ -3507,14 +3501,14 @@ jest-diff@^29.7.0: jest-docblock@^29.7.0: version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-29.7.0.tgz#8fddb6adc3cdc955c93e2a87f61cfd350d5d119a" + resolved "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz" integrity sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g== dependencies: detect-newline "^3.0.0" jest-each@^29.7.0: version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-29.7.0.tgz#162a9b3f2328bdd991beaabffbb74745e56577d1" + resolved "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz" integrity sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ== dependencies: "@jest/types" "^29.6.3" @@ -3525,7 +3519,7 @@ jest-each@^29.7.0: jest-environment-node@^29.7.0: version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-29.7.0.tgz#0b93e111dda8ec120bc8300e6d1fb9576e164376" + resolved "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz" integrity sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw== dependencies: "@jest/environment" "^29.7.0" @@ -3537,12 +3531,12 @@ jest-environment-node@^29.7.0: jest-get-type@^29.6.3: version "29.6.3" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.6.3.tgz#36f499fdcea197c1045a127319c0481723908fd1" + resolved "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz" integrity sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw== jest-haste-map@^29.7.0: version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-29.7.0.tgz#3c2396524482f5a0506376e6c858c3bbcc17b104" + resolved "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz" integrity sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA== dependencies: "@jest/types" "^29.6.3" @@ -3561,7 +3555,7 @@ jest-haste-map@^29.7.0: jest-leak-detector@^29.7.0: version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz#5b7ec0dadfdfec0ca383dc9aa016d36b5ea4c728" + resolved "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz" integrity sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw== dependencies: jest-get-type "^29.6.3" @@ -3569,7 +3563,7 @@ jest-leak-detector@^29.7.0: jest-matcher-utils@^29.7.0: version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz#ae8fec79ff249fd592ce80e3ee474e83a6c44f12" + resolved "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz" integrity sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g== dependencies: chalk "^4.0.0" @@ -3579,7 +3573,7 @@ jest-matcher-utils@^29.7.0: jest-message-util@^29.7.0: version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.7.0.tgz#8bc392e204e95dfe7564abbe72a404e28e51f7f3" + resolved "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz" integrity sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w== dependencies: "@babel/code-frame" "^7.12.13" @@ -3594,7 +3588,7 @@ jest-message-util@^29.7.0: jest-mock@^29.7.0: version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.7.0.tgz#4e836cf60e99c6fcfabe9f99d017f3fdd50a6347" + resolved "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz" integrity sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw== dependencies: "@jest/types" "^29.6.3" @@ -3603,25 +3597,25 @@ jest-mock@^29.7.0: jest-pnp-resolver@^1.2.2: version "1.2.3" - resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz#930b1546164d4ad5937d5540e711d4d38d4cad2e" + resolved "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz" integrity sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w== jest-regex-util@^29.6.3: version "29.6.3" - resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-29.6.3.tgz#4a556d9c776af68e1c5f48194f4d0327d24e8a52" + resolved "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz" integrity sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg== jest-resolve-dependencies@^29.7.0: version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz#1b04f2c095f37fc776ff40803dc92921b1e88428" + resolved "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz" integrity sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA== dependencies: jest-regex-util "^29.6.3" jest-snapshot "^29.7.0" -jest-resolve@^29.7.0: +jest-resolve@*, jest-resolve@^29.7.0: version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-29.7.0.tgz#64d6a8992dd26f635ab0c01e5eef4399c6bcbc30" + resolved "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz" integrity sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA== dependencies: chalk "^4.0.0" @@ -3636,7 +3630,7 @@ jest-resolve@^29.7.0: jest-runner@^29.7.0: version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-29.7.0.tgz#809af072d408a53dcfd2e849a4c976d3132f718e" + resolved "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz" integrity sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ== dependencies: "@jest/console" "^29.7.0" @@ -3663,7 +3657,7 @@ jest-runner@^29.7.0: jest-runtime@^29.7.0: version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-29.7.0.tgz#efecb3141cf7d3767a3a0cc8f7c9990587d3d817" + resolved "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz" integrity sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ== dependencies: "@jest/environment" "^29.7.0" @@ -3691,7 +3685,7 @@ jest-runtime@^29.7.0: jest-snapshot@^29.7.0: version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-29.7.0.tgz#c2c574c3f51865da1bb329036778a69bf88a6be5" + resolved "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz" integrity sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw== dependencies: "@babel/core" "^7.11.6" @@ -3715,9 +3709,9 @@ jest-snapshot@^29.7.0: pretty-format "^29.7.0" semver "^7.5.3" -jest-util@^29.7.0: +jest-util@^29.0.0, jest-util@^29.7.0: version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.7.0.tgz#23c2b62bfb22be82b44de98055802ff3710fc0bc" + resolved "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz" integrity sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA== dependencies: "@jest/types" "^29.6.3" @@ -3729,7 +3723,7 @@ jest-util@^29.7.0: jest-validate@^29.7.0: version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-29.7.0.tgz#7bf705511c64da591d46b15fce41400d52147d9c" + resolved "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz" integrity sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw== dependencies: "@jest/types" "^29.6.3" @@ -3741,7 +3735,7 @@ jest-validate@^29.7.0: jest-watcher@^29.7.0: version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-29.7.0.tgz#7810d30d619c3a62093223ce6bb359ca1b28a2f2" + resolved "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz" integrity sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g== dependencies: "@jest/test-result" "^29.7.0" @@ -3755,7 +3749,7 @@ jest-watcher@^29.7.0: jest-worker@^29.7.0: version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.7.0.tgz#acad073acbbaeb7262bd5389e1bcf43e10058d4a" + resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz" integrity sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw== dependencies: "@types/node" "*" @@ -3763,9 +3757,9 @@ jest-worker@^29.7.0: merge-stream "^2.0.0" supports-color "^8.0.0" -jest@^29.2.1: +jest@^29.0.0, jest@^29.7.0: version "29.7.0" - resolved "https://registry.yarnpkg.com/jest/-/jest-29.7.0.tgz#994676fc24177f088f1c5e3737f5697204ff2613" + resolved "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz" integrity sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw== dependencies: "@jest/core" "^29.7.0" @@ -3775,17 +3769,17 @@ jest@^29.2.1: jiti@^1.21.0: version "1.21.0" - resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.21.0.tgz#7c97f8fe045724e136a397f7340475244156105d" + resolved "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz" integrity sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q== "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== js-yaml@^3.13.1: version "3.14.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz" integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== dependencies: argparse "^1.0.7" @@ -3793,51 +3787,51 @@ js-yaml@^3.13.1: js-yaml@^4.1.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz" integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== dependencies: argparse "^2.0.1" jsesc@^2.5.1: version "2.5.2" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + resolved "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz" integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== json-buffer@3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" + resolved "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz" integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== json-parse-even-better-errors@^2.3.0: version "2.3.1" - resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + resolved "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz" integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== json-schema-traverse@^0.4.1: version "0.4.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== json-stable-stringify-without-jsonify@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz" integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== json5@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" + resolved "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz" integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== dependencies: minimist "^1.2.0" json5@^2.2.3: version "2.2.3" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + resolved "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz" integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== "jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.3.5: version "3.3.5" - resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz#4766bd05a8e2a11af222becd19e15575e52a853a" + resolved "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz" integrity sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ== dependencies: array-includes "^3.1.6" @@ -3847,41 +3841,41 @@ json5@^2.2.3: keyv@^4.5.3: version "4.5.4" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" + resolved "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz" integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== dependencies: json-buffer "3.0.1" kleur@^3.0.3: version "3.0.3" - resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" + resolved "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz" integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== kleur@^4.0.3: version "4.1.5" - resolved "https://registry.yarnpkg.com/kleur/-/kleur-4.1.5.tgz#95106101795f7050c6c650f350c683febddb1780" + resolved "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz" integrity sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ== language-subtag-registry@^0.3.20: version "0.3.22" - resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz#2e1500861b2e457eba7e7ae86877cbd08fa1fd1d" + resolved "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz" integrity sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w== language-tags@^1.0.9: version "1.0.9" - resolved "https://registry.yarnpkg.com/language-tags/-/language-tags-1.0.9.tgz#1ffdcd0ec0fafb4b1be7f8b11f306ad0f9c08777" + resolved "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz" integrity sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA== dependencies: language-subtag-registry "^0.3.20" leven@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" + resolved "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz" integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== levn@^0.4.1: version "0.4.1" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + resolved "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz" integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== dependencies: prelude-ls "^1.2.1" @@ -3889,115 +3883,125 @@ levn@^0.4.1: lib0@^0.2.42, lib0@^0.2.85, lib0@^0.2.86: version "0.2.93" - resolved "https://registry.yarnpkg.com/lib0/-/lib0-0.2.93.tgz#95487c2a97657313cb1d91fbcf9f6d64b7fcd062" + resolved "https://registry.npmjs.org/lib0/-/lib0-0.2.93.tgz" integrity sha512-M5IKsiFJYulS+8Eal8f+zAqf5ckm1vffW0fFDxfgxJ+uiVopvDdd3PxJmz0GsVi3YNO7QCFSq0nAsiDmNhLj9Q== dependencies: isomorphic.js "^0.2.4" lilconfig@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.1.0.tgz#78e23ac89ebb7e1bfbf25b18043de756548e7f52" + resolved "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz" integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ== lilconfig@^3.0.0: version "3.1.1" - resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-3.1.1.tgz#9d8a246fa753106cfc205fd2d77042faca56e5e3" + resolved "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.1.tgz" integrity sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ== lines-and-columns@^1.1.6: version "1.2.4" - resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" + resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz" integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== linkify-it@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-5.0.0.tgz#9ef238bfa6dc70bd8e7f9572b52d369af569b421" + resolved "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz" integrity sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ== dependencies: uc.micro "^2.0.0" linkifyjs@^4.1.0: version "4.1.3" - resolved "https://registry.yarnpkg.com/linkifyjs/-/linkifyjs-4.1.3.tgz#0edbc346428a7390a23ea2e5939f76112c9ae07f" + resolved "https://registry.npmjs.org/linkifyjs/-/linkifyjs-4.1.3.tgz" integrity sha512-auMesunaJ8yfkHvK4gfg1K0SaKX/6Wn9g2Aac/NwX+l5VdmFZzo/hdPGxEOETj+ryRa4/fiOPjeeKURSAJx1sg== locate-path@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz" integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== dependencies: p-locate "^4.1.0" locate-path@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz" integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== dependencies: p-locate "^5.0.0" +lodash.memoize@4.x: + version "4.1.2" + resolved "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz" + integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag== + lodash.merge@^4.6.2: version "4.6.2" - resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== lodash@^4.17.21: version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== longest-streak@^3.0.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/longest-streak/-/longest-streak-3.1.0.tgz#62fa67cd958742a1574af9f39866364102d90cd4" + resolved "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz" integrity sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g== loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + resolved "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz" integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== dependencies: js-tokens "^3.0.0 || ^4.0.0" lru-cache@^10.2.0: version "10.2.2" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.2.2.tgz#48206bc114c1252940c41b25b41af5b545aca878" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz" integrity sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ== lru-cache@^5.1.1: version "5.1.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz" integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== dependencies: yallist "^3.0.2" lru-cache@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz" integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== dependencies: yallist "^4.0.0" lucide-react@^0.378.0: version "0.378.0" - resolved "https://registry.yarnpkg.com/lucide-react/-/lucide-react-0.378.0.tgz#232acb99c6baedfa90959a2c0dd11327b058bde8" + resolved "https://registry.npmjs.org/lucide-react/-/lucide-react-0.378.0.tgz" integrity sha512-u6EPU8juLUk9ytRcyapkWI18epAv3RU+6+TC23ivjR0e+glWKBobFeSgRwOIJihzktILQuy6E0E80P2jVTDR5g== make-dir@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-4.0.0.tgz#c3c2307a771277cd9638305f915c29ae741b614e" + resolved "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz" integrity sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw== dependencies: semver "^7.5.3" +make-error@1.x: + version "1.3.6" + resolved "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== + makeerror@1.0.12: version "1.0.12" - resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a" + resolved "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz" integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== dependencies: tmpl "1.0.5" markdown-it@^14.0.0: version "14.1.0" - resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-14.1.0.tgz#3c3c5992883c633db4714ccb4d7b5935d98b7d45" + resolved "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz" integrity sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg== dependencies: argparse "^2.0.1" @@ -4009,12 +4013,12 @@ markdown-it@^14.0.0: markdown-table@^3.0.0: version "3.0.3" - resolved "https://registry.yarnpkg.com/markdown-table/-/markdown-table-3.0.3.tgz#e6331d30e493127e031dd385488b5bd326e4a6bd" + resolved "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.3.tgz" integrity sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw== mdast-util-definitions@^5.0.0: version "5.1.2" - resolved "https://registry.yarnpkg.com/mdast-util-definitions/-/mdast-util-definitions-5.1.2.tgz#9910abb60ac5d7115d6819b57ae0bcef07a3f7a7" + resolved "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-5.1.2.tgz" integrity sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA== dependencies: "@types/mdast" "^3.0.0" @@ -4023,7 +4027,7 @@ mdast-util-definitions@^5.0.0: mdast-util-find-and-replace@^2.0.0: version "2.2.2" - resolved "https://registry.yarnpkg.com/mdast-util-find-and-replace/-/mdast-util-find-and-replace-2.2.2.tgz#cc2b774f7f3630da4bd592f61966fecade8b99b1" + resolved "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-2.2.2.tgz" integrity sha512-MTtdFRz/eMDHXzeK6W3dO7mXUlF82Gom4y0oOgvHhh/HXZAGvIQDUvQ0SuUx+j2tv44b8xTHOm8K/9OoRFnXKw== dependencies: "@types/mdast" "^3.0.0" @@ -4033,7 +4037,7 @@ mdast-util-find-and-replace@^2.0.0: mdast-util-from-markdown@^1.0.0: version "1.3.1" - resolved "https://registry.yarnpkg.com/mdast-util-from-markdown/-/mdast-util-from-markdown-1.3.1.tgz#9421a5a247f10d31d2faed2a30df5ec89ceafcf0" + resolved "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-1.3.1.tgz" integrity sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww== dependencies: "@types/mdast" "^3.0.0" @@ -4051,7 +4055,7 @@ mdast-util-from-markdown@^1.0.0: mdast-util-gfm-autolink-literal@^1.0.0: version "1.0.3" - resolved "https://registry.yarnpkg.com/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-1.0.3.tgz#67a13abe813d7eba350453a5333ae1bc0ec05c06" + resolved "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-1.0.3.tgz" integrity sha512-My8KJ57FYEy2W2LyNom4n3E7hKTuQk/0SES0u16tjA9Z3oFkF4RrC/hPAPgjlSpezsOvI8ObcXcElo92wn5IGA== dependencies: "@types/mdast" "^3.0.0" @@ -4061,7 +4065,7 @@ mdast-util-gfm-autolink-literal@^1.0.0: mdast-util-gfm-footnote@^1.0.0: version "1.0.2" - resolved "https://registry.yarnpkg.com/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-1.0.2.tgz#ce5e49b639c44de68d5bf5399877a14d5020424e" + resolved "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-1.0.2.tgz" integrity sha512-56D19KOGbE00uKVj3sgIykpwKL179QsVFwx/DCW0u/0+URsryacI4MAdNJl0dh+u2PSsD9FtxPFbHCzJ78qJFQ== dependencies: "@types/mdast" "^3.0.0" @@ -4070,7 +4074,7 @@ mdast-util-gfm-footnote@^1.0.0: mdast-util-gfm-strikethrough@^1.0.0: version "1.0.3" - resolved "https://registry.yarnpkg.com/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-1.0.3.tgz#5470eb105b483f7746b8805b9b989342085795b7" + resolved "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-1.0.3.tgz" integrity sha512-DAPhYzTYrRcXdMjUtUjKvW9z/FNAMTdU0ORyMcbmkwYNbKocDpdk+PX1L1dQgOID/+vVs1uBQ7ElrBQfZ0cuiQ== dependencies: "@types/mdast" "^3.0.0" @@ -4078,7 +4082,7 @@ mdast-util-gfm-strikethrough@^1.0.0: mdast-util-gfm-table@^1.0.0: version "1.0.7" - resolved "https://registry.yarnpkg.com/mdast-util-gfm-table/-/mdast-util-gfm-table-1.0.7.tgz#3552153a146379f0f9c4c1101b071d70bbed1a46" + resolved "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-1.0.7.tgz" integrity sha512-jjcpmNnQvrmN5Vx7y7lEc2iIOEytYv7rTvu+MeyAsSHTASGCCRA79Igg2uKssgOs1i1po8s3plW0sTu1wkkLGg== dependencies: "@types/mdast" "^3.0.0" @@ -4088,7 +4092,7 @@ mdast-util-gfm-table@^1.0.0: mdast-util-gfm-task-list-item@^1.0.0: version "1.0.2" - resolved "https://registry.yarnpkg.com/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-1.0.2.tgz#b280fcf3b7be6fd0cc012bbe67a59831eb34097b" + resolved "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-1.0.2.tgz" integrity sha512-PFTA1gzfp1B1UaiJVyhJZA1rm0+Tzn690frc/L8vNX1Jop4STZgOE6bxUhnzdVSB+vm2GU1tIsuQcA9bxTQpMQ== dependencies: "@types/mdast" "^3.0.0" @@ -4096,7 +4100,7 @@ mdast-util-gfm-task-list-item@^1.0.0: mdast-util-gfm@^2.0.0: version "2.0.2" - resolved "https://registry.yarnpkg.com/mdast-util-gfm/-/mdast-util-gfm-2.0.2.tgz#e92f4d8717d74bdba6de57ed21cc8b9552e2d0b6" + resolved "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-2.0.2.tgz" integrity sha512-qvZ608nBppZ4icQlhQQIAdc6S3Ffj9RGmzwUKUWuEICFnd1LVkN3EktF7ZHAgfcEdvZB5owU9tQgt99e2TlLjg== dependencies: mdast-util-from-markdown "^1.0.0" @@ -4109,7 +4113,7 @@ mdast-util-gfm@^2.0.0: mdast-util-phrasing@^3.0.0: version "3.0.1" - resolved "https://registry.yarnpkg.com/mdast-util-phrasing/-/mdast-util-phrasing-3.0.1.tgz#c7c21d0d435d7fb90956038f02e8702781f95463" + resolved "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-3.0.1.tgz" integrity sha512-WmI1gTXUBJo4/ZmSk79Wcb2HcjPJBzM1nlI/OUWA8yk2X9ik3ffNbBGsU+09BFmXaL1IBb9fiuvq6/KMiNycSg== dependencies: "@types/mdast" "^3.0.0" @@ -4117,7 +4121,7 @@ mdast-util-phrasing@^3.0.0: mdast-util-to-hast@^12.1.0: version "12.3.0" - resolved "https://registry.yarnpkg.com/mdast-util-to-hast/-/mdast-util-to-hast-12.3.0.tgz#045d2825fb04374e59970f5b3f279b5700f6fb49" + resolved "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-12.3.0.tgz" integrity sha512-pits93r8PhnIoU4Vy9bjW39M2jJ6/tdHyja9rrot9uujkN7UTU9SDnE6WNJz/IGyQk3XHX6yNNtrBH6cQzm8Hw== dependencies: "@types/hast" "^2.0.0" @@ -4131,7 +4135,7 @@ mdast-util-to-hast@^12.1.0: mdast-util-to-markdown@^1.0.0, mdast-util-to-markdown@^1.3.0: version "1.5.0" - resolved "https://registry.yarnpkg.com/mdast-util-to-markdown/-/mdast-util-to-markdown-1.5.0.tgz#c13343cb3fc98621911d33b5cd42e7d0731171c6" + resolved "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-1.5.0.tgz" integrity sha512-bbv7TPv/WC49thZPg3jXuqzuvI45IL2EVAr/KxF0BSdHsU0ceFHOmwQn6evxAh1GaoK/6GQ1wp4R4oW2+LFL/A== dependencies: "@types/mdast" "^3.0.0" @@ -4145,29 +4149,29 @@ mdast-util-to-markdown@^1.0.0, mdast-util-to-markdown@^1.3.0: mdast-util-to-string@^3.0.0, mdast-util-to-string@^3.1.0: version "3.2.0" - resolved "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-3.2.0.tgz#66f7bb6324756741c5f47a53557f0cbf16b6f789" + resolved "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.2.0.tgz" integrity sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg== dependencies: "@types/mdast" "^3.0.0" mdurl@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-2.0.0.tgz#80676ec0433025dd3e17ee983d0fe8de5a2237e0" + resolved "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz" integrity sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w== merge-stream@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + resolved "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz" integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== merge2@^1.3.0, merge2@^1.4.1: version "1.4.1" - resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== micromark-core-commonmark@^1.0.0, micromark-core-commonmark@^1.0.1: version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-core-commonmark/-/micromark-core-commonmark-1.1.0.tgz#1386628df59946b2d39fb2edfd10f3e8e0a75bb8" + resolved "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-1.1.0.tgz" integrity sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw== dependencies: decode-named-character-reference "^1.0.0" @@ -4189,7 +4193,7 @@ micromark-core-commonmark@^1.0.0, micromark-core-commonmark@^1.0.1: micromark-extension-gfm-autolink-literal@^1.0.0: version "1.0.5" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-1.0.5.tgz#5853f0e579bbd8ef9e39a7c0f0f27c5a063a66e7" + resolved "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-1.0.5.tgz" integrity sha512-z3wJSLrDf8kRDOh2qBtoTRD53vJ+CWIyo7uyZuxf/JAbNJjiHsOpG1y5wxk8drtv3ETAHutCu6N3thkOOgueWg== dependencies: micromark-util-character "^1.0.0" @@ -4199,7 +4203,7 @@ micromark-extension-gfm-autolink-literal@^1.0.0: micromark-extension-gfm-footnote@^1.0.0: version "1.1.2" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-1.1.2.tgz#05e13034d68f95ca53c99679040bc88a6f92fe2e" + resolved "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-1.1.2.tgz" integrity sha512-Yxn7z7SxgyGWRNa4wzf8AhYYWNrwl5q1Z8ii+CSTTIqVkmGZF1CElX2JI8g5yGoM3GAman9/PVCUFUSJ0kB/8Q== dependencies: micromark-core-commonmark "^1.0.0" @@ -4213,7 +4217,7 @@ micromark-extension-gfm-footnote@^1.0.0: micromark-extension-gfm-strikethrough@^1.0.0: version "1.0.7" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-1.0.7.tgz#c8212c9a616fa3bf47cb5c711da77f4fdc2f80af" + resolved "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-1.0.7.tgz" integrity sha512-sX0FawVE1o3abGk3vRjOH50L5TTLr3b5XMqnP9YDRb34M0v5OoZhG+OHFz1OffZ9dlwgpTBKaT4XW/AsUVnSDw== dependencies: micromark-util-chunked "^1.0.0" @@ -4225,7 +4229,7 @@ micromark-extension-gfm-strikethrough@^1.0.0: micromark-extension-gfm-table@^1.0.0: version "1.0.7" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm-table/-/micromark-extension-gfm-table-1.0.7.tgz#dcb46074b0c6254c3fc9cc1f6f5002c162968008" + resolved "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-1.0.7.tgz" integrity sha512-3ZORTHtcSnMQEKtAOsBQ9/oHp9096pI/UvdPtN7ehKvrmZZ2+bbWhi0ln+I9drmwXMt5boocn6OlwQzNXeVeqw== dependencies: micromark-factory-space "^1.0.0" @@ -4236,14 +4240,14 @@ micromark-extension-gfm-table@^1.0.0: micromark-extension-gfm-tagfilter@^1.0.0: version "1.0.2" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-1.0.2.tgz#aa7c4dd92dabbcb80f313ebaaa8eb3dac05f13a7" + resolved "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-1.0.2.tgz" integrity sha512-5XWB9GbAUSHTn8VPU8/1DBXMuKYT5uOgEjJb8gN3mW0PNW5OPHpSdojoqf+iq1xo7vWzw/P8bAHY0n6ijpXF7g== dependencies: micromark-util-types "^1.0.0" micromark-extension-gfm-task-list-item@^1.0.0: version "1.0.5" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-1.0.5.tgz#b52ce498dc4c69b6a9975abafc18f275b9dde9f4" + resolved "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-1.0.5.tgz" integrity sha512-RMFXl2uQ0pNQy6Lun2YBYT9g9INXtWJULgbt01D/x8/6yJ2qpKyzdZD3pi6UIkzF++Da49xAelVKUeUMqd5eIQ== dependencies: micromark-factory-space "^1.0.0" @@ -4254,7 +4258,7 @@ micromark-extension-gfm-task-list-item@^1.0.0: micromark-extension-gfm@^2.0.0: version "2.0.3" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm/-/micromark-extension-gfm-2.0.3.tgz#e517e8579949a5024a493e49204e884aa74f5acf" + resolved "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-2.0.3.tgz" integrity sha512-vb9OoHqrhCmbRidQv/2+Bc6pkP0FrtlhurxZofvOEy5o8RtuuvTq+RQ1Vw5ZDNrVraQZu3HixESqbG+0iKk/MQ== dependencies: micromark-extension-gfm-autolink-literal "^1.0.0" @@ -4268,7 +4272,7 @@ micromark-extension-gfm@^2.0.0: micromark-factory-destination@^1.0.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-factory-destination/-/micromark-factory-destination-1.1.0.tgz#eb815957d83e6d44479b3df640f010edad667b9f" + resolved "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-1.1.0.tgz" integrity sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg== dependencies: micromark-util-character "^1.0.0" @@ -4277,7 +4281,7 @@ micromark-factory-destination@^1.0.0: micromark-factory-label@^1.0.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-factory-label/-/micromark-factory-label-1.1.0.tgz#cc95d5478269085cfa2a7282b3de26eb2e2dec68" + resolved "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-1.1.0.tgz" integrity sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w== dependencies: micromark-util-character "^1.0.0" @@ -4287,7 +4291,7 @@ micromark-factory-label@^1.0.0: micromark-factory-space@^1.0.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-factory-space/-/micromark-factory-space-1.1.0.tgz#c8f40b0640a0150751d3345ed885a080b0d15faf" + resolved "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-1.1.0.tgz" integrity sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ== dependencies: micromark-util-character "^1.0.0" @@ -4295,7 +4299,7 @@ micromark-factory-space@^1.0.0: micromark-factory-title@^1.0.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-factory-title/-/micromark-factory-title-1.1.0.tgz#dd0fe951d7a0ac71bdc5ee13e5d1465ad7f50ea1" + resolved "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-1.1.0.tgz" integrity sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ== dependencies: micromark-factory-space "^1.0.0" @@ -4305,7 +4309,7 @@ micromark-factory-title@^1.0.0: micromark-factory-whitespace@^1.0.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-factory-whitespace/-/micromark-factory-whitespace-1.1.0.tgz#798fb7489f4c8abafa7ca77eed6b5745853c9705" + resolved "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-1.1.0.tgz" integrity sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ== dependencies: micromark-factory-space "^1.0.0" @@ -4315,7 +4319,7 @@ micromark-factory-whitespace@^1.0.0: micromark-util-character@^1.0.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/micromark-util-character/-/micromark-util-character-1.2.0.tgz#4fedaa3646db249bc58caeb000eb3549a8ca5dcc" + resolved "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.2.0.tgz" integrity sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg== dependencies: micromark-util-symbol "^1.0.0" @@ -4323,14 +4327,14 @@ micromark-util-character@^1.0.0: micromark-util-chunked@^1.0.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-util-chunked/-/micromark-util-chunked-1.1.0.tgz#37a24d33333c8c69a74ba12a14651fd9ea8a368b" + resolved "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-1.1.0.tgz" integrity sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ== dependencies: micromark-util-symbol "^1.0.0" micromark-util-classify-character@^1.0.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-util-classify-character/-/micromark-util-classify-character-1.1.0.tgz#6a7f8c8838e8a120c8e3c4f2ae97a2bff9190e9d" + resolved "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-1.1.0.tgz" integrity sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw== dependencies: micromark-util-character "^1.0.0" @@ -4339,7 +4343,7 @@ micromark-util-classify-character@^1.0.0: micromark-util-combine-extensions@^1.0.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.1.0.tgz#192e2b3d6567660a85f735e54d8ea6e3952dbe84" + resolved "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.1.0.tgz" integrity sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA== dependencies: micromark-util-chunked "^1.0.0" @@ -4347,14 +4351,14 @@ micromark-util-combine-extensions@^1.0.0: micromark-util-decode-numeric-character-reference@^1.0.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.1.0.tgz#b1e6e17009b1f20bc652a521309c5f22c85eb1c6" + resolved "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.1.0.tgz" integrity sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw== dependencies: micromark-util-symbol "^1.0.0" micromark-util-decode-string@^1.0.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-util-decode-string/-/micromark-util-decode-string-1.1.0.tgz#dc12b078cba7a3ff690d0203f95b5d5537f2809c" + resolved "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-1.1.0.tgz" integrity sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ== dependencies: decode-named-character-reference "^1.0.0" @@ -4364,31 +4368,31 @@ micromark-util-decode-string@^1.0.0: micromark-util-encode@^1.0.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-util-encode/-/micromark-util-encode-1.1.0.tgz#92e4f565fd4ccb19e0dcae1afab9a173bbeb19a5" + resolved "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-1.1.0.tgz" integrity sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw== micromark-util-html-tag-name@^1.0.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.2.0.tgz#48fd7a25826f29d2f71479d3b4e83e94829b3588" + resolved "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.2.0.tgz" integrity sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q== micromark-util-normalize-identifier@^1.0.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.1.0.tgz#7a73f824eb9f10d442b4d7f120fecb9b38ebf8b7" + resolved "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.1.0.tgz" integrity sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q== dependencies: micromark-util-symbol "^1.0.0" micromark-util-resolve-all@^1.0.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-util-resolve-all/-/micromark-util-resolve-all-1.1.0.tgz#4652a591ee8c8fa06714c9b54cd6c8e693671188" + resolved "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-1.1.0.tgz" integrity sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA== dependencies: micromark-util-types "^1.0.0" micromark-util-sanitize-uri@^1.0.0, micromark-util-sanitize-uri@^1.1.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.2.0.tgz#613f738e4400c6eedbc53590c67b197e30d7f90d" + resolved "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.2.0.tgz" integrity sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A== dependencies: micromark-util-character "^1.0.0" @@ -4397,7 +4401,7 @@ micromark-util-sanitize-uri@^1.0.0, micromark-util-sanitize-uri@^1.1.0: micromark-util-subtokenize@^1.0.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-util-subtokenize/-/micromark-util-subtokenize-1.1.0.tgz#941c74f93a93eaf687b9054aeb94642b0e92edb1" + resolved "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-1.1.0.tgz" integrity sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A== dependencies: micromark-util-chunked "^1.0.0" @@ -4407,17 +4411,17 @@ micromark-util-subtokenize@^1.0.0: micromark-util-symbol@^1.0.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz#813cd17837bdb912d069a12ebe3a44b6f7063142" + resolved "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz" integrity sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag== micromark-util-types@^1.0.0, micromark-util-types@^1.0.1: version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-util-types/-/micromark-util-types-1.1.0.tgz#e6676a8cae0bb86a2171c498167971886cb7e283" + resolved "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz" integrity sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg== micromark@^3.0.0: version "3.2.0" - resolved "https://registry.yarnpkg.com/micromark/-/micromark-3.2.0.tgz#1af9fef3f995ea1ea4ac9c7e2f19c48fd5c006e9" + resolved "https://registry.npmjs.org/micromark/-/micromark-3.2.0.tgz" integrity sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA== dependencies: "@types/debug" "^4.0.0" @@ -4440,7 +4444,7 @@ micromark@^3.0.0: micromatch@^4.0.4, micromatch@^4.0.5: version "4.0.5" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" + resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz" integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== dependencies: braces "^3.0.2" @@ -4448,58 +4452,58 @@ micromatch@^4.0.4, micromatch@^4.0.5: mimic-fn@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== -minimatch@9.0.3: - version "9.0.3" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825" - integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== - dependencies: - brace-expansion "^2.0.1" - minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== dependencies: brace-expansion "^1.1.7" minimatch@^9.0.1: version "9.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.4.tgz#8e49c731d1749cbec05050ee5145147b32496a51" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz" integrity sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw== dependencies: brace-expansion "^2.0.1" +minimatch@9.0.3: + version "9.0.3" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz" + integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== + dependencies: + brace-expansion "^2.0.1" + minimist@^1.2.0, minimist@^1.2.6: version "1.2.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== "minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.0.4: version "7.1.0" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.0.tgz#b545f84af94e567386770159302ca113469c80b8" + resolved "https://registry.npmjs.org/minipass/-/minipass-7.1.0.tgz" integrity sha512-oGZRv2OT1lO2UF1zUcwdTb3wqUwI0kBGTgt/T7OdSj6M6N5m3o5uPf0AIW6lVxGGoiWUR7e2AwTE+xiwK8WQig== mri@^1.1.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/mri/-/mri-1.2.0.tgz#6721480fec2a11a4889861115a48b6cbe7cc8f0b" + resolved "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz" integrity sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA== -ms@2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - ms@^2.1.1: version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== +ms@2.1.2: + version "2.1.2" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + mz@^2.7.0: version "2.7.0" - resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" + resolved "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz" integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== dependencies: any-promise "^1.0.0" @@ -4508,17 +4512,17 @@ mz@^2.7.0: nanoid@^3.3.6, nanoid@^3.3.7: version "3.3.7" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" + resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz" integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== natural-compare@^1.4.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== next@14.2.3: version "14.2.3" - resolved "https://registry.yarnpkg.com/next/-/next-14.2.3.tgz#f117dd5d5f20c307e7b8e4f9c1c97d961008925d" + resolved "https://registry.npmjs.org/next/-/next-14.2.3.tgz" integrity sha512-dowFkFTR8v79NPJO4QsBUtxv0g9BrS/phluVpMAt2ku7H+cbcBJlopXjkWlwxrk/xGqMemr7JkGPGemPrLLX7A== dependencies: "@next/env" "14.2.3" @@ -4541,54 +4545,54 @@ next@14.2.3: node-int64@^0.4.0: version "0.4.0" - resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" + resolved "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz" integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== node-releases@^2.0.14: version "2.0.14" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.14.tgz#2ffb053bceb8b2be8495ece1ab6ce600c4461b0b" + resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz" integrity sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw== normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== normalize-range@^0.1.2: version "0.1.2" - resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" + resolved "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz" integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA== npm-run-path@^4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz" integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== dependencies: path-key "^3.0.0" object-assign@^4.0.1, object-assign@^4.1.1: version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== object-hash@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-3.0.0.tgz#73f97f753e7baffc0e2cc9d6e079079744ac82e9" + resolved "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz" integrity sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw== object-inspect@^1.13.1: version "1.13.1" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.1.tgz#b96c6109324ccfef6b12216a956ca4dc2ff94bc2" + resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz" integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ== object-keys@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + resolved "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== object.assign@^4.1.4, object.assign@^4.1.5: version "4.1.5" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.5.tgz#3a833f9ab7fdb80fc9e8d2300c803d216d8fdbb0" + resolved "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz" integrity sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ== dependencies: call-bind "^1.0.5" @@ -4598,7 +4602,7 @@ object.assign@^4.1.4, object.assign@^4.1.5: object.entries@^1.1.7: version "1.1.8" - resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.8.tgz#bffe6f282e01f4d17807204a24f8edd823599c41" + resolved "https://registry.npmjs.org/object.entries/-/object.entries-1.1.8.tgz" integrity sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ== dependencies: call-bind "^1.0.7" @@ -4607,7 +4611,7 @@ object.entries@^1.1.7: object.fromentries@^2.0.7: version "2.0.8" - resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.8.tgz#f7195d8a9b97bd95cbc1999ea939ecd1a2b00c65" + resolved "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz" integrity sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ== dependencies: call-bind "^1.0.7" @@ -4617,7 +4621,7 @@ object.fromentries@^2.0.7: object.groupby@^1.0.1: version "1.0.3" - resolved "https://registry.yarnpkg.com/object.groupby/-/object.groupby-1.0.3.tgz#9b125c36238129f6f7b61954a1e7176148d5002e" + resolved "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz" integrity sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ== dependencies: call-bind "^1.0.7" @@ -4626,7 +4630,7 @@ object.groupby@^1.0.1: object.hasown@^1.1.3: version "1.1.4" - resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.4.tgz#e270ae377e4c120cdcb7656ce66884a6218283dc" + resolved "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.4.tgz" integrity sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg== dependencies: define-properties "^1.2.1" @@ -4635,7 +4639,7 @@ object.hasown@^1.1.3: object.values@^1.1.6, object.values@^1.1.7: version "1.2.0" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.2.0.tgz#65405a9d92cee68ac2d303002e0b8470a4d9ab1b" + resolved "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz" integrity sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ== dependencies: call-bind "^1.0.7" @@ -4644,21 +4648,21 @@ object.values@^1.1.6, object.values@^1.1.7: once@^1.3.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== dependencies: wrappy "1" onetime@^5.1.2: version "5.1.2" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + resolved "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz" integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== dependencies: mimic-fn "^2.1.0" optionator@^0.9.3: version "0.9.4" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734" + resolved "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz" integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== dependencies: deep-is "^0.1.3" @@ -4670,52 +4674,52 @@ optionator@^0.9.3: orderedmap@^2.0.0: version "2.1.1" - resolved "https://registry.yarnpkg.com/orderedmap/-/orderedmap-2.1.1.tgz#61481269c44031c449915497bf5a4ad273c512d2" + resolved "https://registry.npmjs.org/orderedmap/-/orderedmap-2.1.1.tgz" integrity sha512-TvAWxi0nDe1j/rtMcWcIj94+Ffe6n7zhow33h40SKxmsmozs6dz/e+EajymfoFcHd7sxNn8yHM8839uixMOV6g== p-limit@^2.2.0: version "2.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz" integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== dependencies: p-try "^2.0.0" p-limit@^3.0.2, p-limit@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== dependencies: yocto-queue "^0.1.0" p-locate@^4.1.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz" integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== dependencies: p-limit "^2.2.0" p-locate@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz" integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== dependencies: p-limit "^3.0.2" p-try@^2.0.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + resolved "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== parent-module@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== dependencies: callsites "^3.0.0" parse-json@^5.2.0: version "5.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" + resolved "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz" integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== dependencies: "@babel/code-frame" "^7.0.0" @@ -4725,32 +4729,32 @@ parse-json@^5.2.0: parse5@^6.0.0: version "6.0.1" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" + resolved "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz" integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== path-exists@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== path-is-absolute@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== path-key@^3.0.0, path-key@^3.1.0: version "3.1.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== path-parse@^1.0.7: version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== path-scurry@^1.10.1, path-scurry@^1.10.2: version "1.10.2" - resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.10.2.tgz#8f6357eb1239d5fa1da8b9f70e9c080675458ba7" + resolved "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.2.tgz" integrity sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA== dependencies: lru-cache "^10.2.0" @@ -4758,44 +4762,44 @@ path-scurry@^1.10.1, path-scurry@^1.10.2: path-type@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== picocolors@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz" integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3, picomatch@^2.3.1: version "2.3.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== pify@^2.3.0: version "2.3.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + resolved "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz" integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== pirates@^4.0.1, pirates@^4.0.4: version "4.0.6" - resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9" + resolved "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz" integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== pkg-dir@^4.2.0: version "4.2.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" + resolved "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz" integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== dependencies: find-up "^4.0.0" possible-typed-array-names@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz#89bb63c6fada2c3e90adc4a647beeeb39cc7bf8f" + resolved "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz" integrity sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q== postcss-import@^15.1.0: version "15.1.0" - resolved "https://registry.yarnpkg.com/postcss-import/-/postcss-import-15.1.0.tgz#41c64ed8cc0e23735a9698b3249ffdbf704adc70" + resolved "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz" integrity sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew== dependencies: postcss-value-parser "^4.0.0" @@ -4804,14 +4808,14 @@ postcss-import@^15.1.0: postcss-js@^4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-js/-/postcss-js-4.0.1.tgz#61598186f3703bab052f1c4f7d805f3991bee9d2" + resolved "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz" integrity sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw== dependencies: camelcase-css "^2.0.1" postcss-load-config@^4.0.1: version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-4.0.2.tgz#7159dcf626118d33e299f485d6afe4aff7c4a3e3" + resolved "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz" integrity sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ== dependencies: lilconfig "^3.0.0" @@ -4819,14 +4823,14 @@ postcss-load-config@^4.0.1: postcss-nested@^6.0.1: version "6.0.1" - resolved "https://registry.yarnpkg.com/postcss-nested/-/postcss-nested-6.0.1.tgz#f83dc9846ca16d2f4fa864f16e9d9f7d0961662c" + resolved "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz" integrity sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ== dependencies: postcss-selector-parser "^6.0.11" postcss-selector-parser@^6.0.11: version "6.0.16" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz#3b88b9f5c5abd989ef4e2fc9ec8eedd34b20fb04" + resolved "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz" integrity sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw== dependencies: cssesc "^3.0.0" @@ -4834,47 +4838,47 @@ postcss-selector-parser@^6.0.11: postcss-value-parser@^4.0.0, postcss-value-parser@^4.2.0: version "4.2.0" - resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" + resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz" integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== +postcss@^8, postcss@^8.0.0, postcss@^8.1.0, postcss@^8.2.14, postcss@^8.4.21, postcss@^8.4.23, postcss@>=8.0.9: + version "8.4.38" + resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz" + integrity sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A== + dependencies: + nanoid "^3.3.7" + picocolors "^1.0.0" + source-map-js "^1.2.0" + postcss@8.4.31: version "8.4.31" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.31.tgz#92b451050a9f914da6755af352bdc0192508656d" + resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz" integrity sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ== dependencies: nanoid "^3.3.6" picocolors "^1.0.0" source-map-js "^1.0.2" -postcss@^8, postcss@^8.4.23: - version "8.4.38" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.38.tgz#b387d533baf2054288e337066d81c6bee9db9e0e" - integrity sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A== - dependencies: - nanoid "^3.3.7" - picocolors "^1.0.0" - source-map-js "^1.2.0" - prelude-ls@^1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== prettier-linter-helpers@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b" + resolved "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz" integrity sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w== dependencies: fast-diff "^1.1.2" -prettier@^3.2.4: +prettier@^3.2.4, prettier@>=3.0.0, "prettier@2.x - 3.x": version "3.2.5" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.2.5.tgz#e52bc3090586e824964a8813b09aba6233b28368" + resolved "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz" integrity sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A== -pretty-format@^29.7.0: +pretty-format@^29.0.0, pretty-format@^29.7.0: version "29.7.0" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.7.0.tgz#ca42c758310f365bfa71a0bda0a807160b776812" + resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz" integrity sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ== dependencies: "@jest/schemas" "^29.6.3" @@ -4883,7 +4887,7 @@ pretty-format@^29.7.0: prompts@^2.0.1: version "2.4.2" - resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" + resolved "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz" integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== dependencies: kleur "^3.0.3" @@ -4891,7 +4895,7 @@ prompts@^2.0.1: prop-types@^15.7.2, prop-types@^15.8.1: version "15.8.1" - resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" + resolved "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz" integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== dependencies: loose-envify "^1.4.0" @@ -4900,26 +4904,26 @@ prop-types@^15.7.2, prop-types@^15.8.1: property-information@^6.0.0: version "6.5.0" - resolved "https://registry.yarnpkg.com/property-information/-/property-information-6.5.0.tgz#6212fbb52ba757e92ef4fb9d657563b933b7ffec" + resolved "https://registry.npmjs.org/property-information/-/property-information-6.5.0.tgz" integrity sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig== prosemirror-changeset@^2.2.1: version "2.2.1" - resolved "https://registry.yarnpkg.com/prosemirror-changeset/-/prosemirror-changeset-2.2.1.tgz#dae94b63aec618fac7bb9061648e6e2a79988383" + resolved "https://registry.npmjs.org/prosemirror-changeset/-/prosemirror-changeset-2.2.1.tgz" integrity sha512-J7msc6wbxB4ekDFj+n9gTW/jav/p53kdlivvuppHsrZXCaQdVgRghoZbSS3kwrRyAstRVQ4/+u5k7YfLgkkQvQ== dependencies: prosemirror-transform "^1.0.0" prosemirror-collab@^1.3.1: version "1.3.1" - resolved "https://registry.yarnpkg.com/prosemirror-collab/-/prosemirror-collab-1.3.1.tgz#0e8c91e76e009b53457eb3b3051fb68dad029a33" + resolved "https://registry.npmjs.org/prosemirror-collab/-/prosemirror-collab-1.3.1.tgz" integrity sha512-4SnynYR9TTYaQVXd/ieUvsVV4PDMBzrq2xPUWutHivDuOshZXqQ5rGbZM84HEaXKbLdItse7weMGOUdDVcLKEQ== dependencies: prosemirror-state "^1.0.0" prosemirror-commands@^1.0.0, prosemirror-commands@^1.5.2: version "1.5.2" - resolved "https://registry.yarnpkg.com/prosemirror-commands/-/prosemirror-commands-1.5.2.tgz#e94aeea52286f658cd984270de9b4c3fff580852" + resolved "https://registry.npmjs.org/prosemirror-commands/-/prosemirror-commands-1.5.2.tgz" integrity sha512-hgLcPaakxH8tu6YvVAaILV2tXYsW3rAdDR8WNkeKGcgeMVQg3/TMhPdVoh7iAmfgVjZGtcOSjKiQaoeKjzd2mQ== dependencies: prosemirror-model "^1.0.0" @@ -4928,7 +4932,7 @@ prosemirror-commands@^1.0.0, prosemirror-commands@^1.5.2: prosemirror-dropcursor@^1.8.1: version "1.8.1" - resolved "https://registry.yarnpkg.com/prosemirror-dropcursor/-/prosemirror-dropcursor-1.8.1.tgz#49b9fb2f583e0d0f4021ff87db825faa2be2832d" + resolved "https://registry.npmjs.org/prosemirror-dropcursor/-/prosemirror-dropcursor-1.8.1.tgz" integrity sha512-M30WJdJZLyXHi3N8vxN6Zh5O8ZBbQCz0gURTfPmTIBNQ5pxrdU7A58QkNqfa98YEjSAL1HUyyU34f6Pm5xBSGw== dependencies: prosemirror-state "^1.0.0" @@ -4937,7 +4941,7 @@ prosemirror-dropcursor@^1.8.1: prosemirror-gapcursor@^1.3.2: version "1.3.2" - resolved "https://registry.yarnpkg.com/prosemirror-gapcursor/-/prosemirror-gapcursor-1.3.2.tgz#5fa336b83789c6199a7341c9493587e249215cb4" + resolved "https://registry.npmjs.org/prosemirror-gapcursor/-/prosemirror-gapcursor-1.3.2.tgz" integrity sha512-wtjswVBd2vaQRrnYZaBCbyDqr232Ed4p2QPtRIUK5FuqHYKGWkEwl08oQM4Tw7DOR0FsasARV5uJFvMZWxdNxQ== dependencies: prosemirror-keymap "^1.0.0" @@ -4947,7 +4951,7 @@ prosemirror-gapcursor@^1.3.2: prosemirror-history@^1.0.0, prosemirror-history@^1.3.2: version "1.4.0" - resolved "https://registry.yarnpkg.com/prosemirror-history/-/prosemirror-history-1.4.0.tgz#1edbce630aaf21b808e5a5cd798a09976ecb1827" + resolved "https://registry.npmjs.org/prosemirror-history/-/prosemirror-history-1.4.0.tgz" integrity sha512-UUiGzDVcqo1lovOPdi9YxxUps3oBFWAIYkXLu3Ot+JPv1qzVogRbcizxK3LhHmtaUxclohgiOVesRw5QSlMnbQ== dependencies: prosemirror-state "^1.2.2" @@ -4957,7 +4961,7 @@ prosemirror-history@^1.0.0, prosemirror-history@^1.3.2: prosemirror-inputrules@^1.3.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/prosemirror-inputrules/-/prosemirror-inputrules-1.4.0.tgz#ef1519bb2cb0d1e0cec74bad1a97f1c1555068bb" + resolved "https://registry.npmjs.org/prosemirror-inputrules/-/prosemirror-inputrules-1.4.0.tgz" integrity sha512-6ygpPRuTJ2lcOXs9JkefieMst63wVJBgHZGl5QOytN7oSZs3Co/BYbc3Yx9zm9H37Bxw8kVzCnDsihsVsL4yEg== dependencies: prosemirror-state "^1.0.0" @@ -4965,7 +4969,7 @@ prosemirror-inputrules@^1.3.0: prosemirror-keymap@^1.0.0, prosemirror-keymap@^1.1.2, prosemirror-keymap@^1.2.2: version "1.2.2" - resolved "https://registry.yarnpkg.com/prosemirror-keymap/-/prosemirror-keymap-1.2.2.tgz#14a54763a29c7b2704f561088ccf3384d14eb77e" + resolved "https://registry.npmjs.org/prosemirror-keymap/-/prosemirror-keymap-1.2.2.tgz" integrity sha512-EAlXoksqC6Vbocqc0GtzCruZEzYgrn+iiGnNjsJsH4mrnIGex4qbLdWWNza3AW5W36ZRrlBID0eM6bdKH4OStQ== dependencies: prosemirror-state "^1.0.0" @@ -4973,7 +4977,7 @@ prosemirror-keymap@^1.0.0, prosemirror-keymap@^1.1.2, prosemirror-keymap@^1.2.2: prosemirror-markdown@^1.12.0: version "1.12.0" - resolved "https://registry.yarnpkg.com/prosemirror-markdown/-/prosemirror-markdown-1.12.0.tgz#d2de09d37897abf7adb6293d925ff132dac5b0a6" + resolved "https://registry.npmjs.org/prosemirror-markdown/-/prosemirror-markdown-1.12.0.tgz" integrity sha512-6F5HS8Z0HDYiS2VQDZzfZP6A0s/I0gbkJy8NCzzDMtcsz3qrfqyroMMeoSjAmOhDITyon11NbXSzztfKi+frSQ== dependencies: markdown-it "^14.0.0" @@ -4981,7 +4985,7 @@ prosemirror-markdown@^1.12.0: prosemirror-menu@^1.2.4: version "1.2.4" - resolved "https://registry.yarnpkg.com/prosemirror-menu/-/prosemirror-menu-1.2.4.tgz#3cfdc7c06d10f9fbd1bce29082c498bd11a0a79a" + resolved "https://registry.npmjs.org/prosemirror-menu/-/prosemirror-menu-1.2.4.tgz" integrity sha512-S/bXlc0ODQup6aiBbWVsX/eM+xJgCTAfMq/nLqaO5ID/am4wS0tTCIkzwytmao7ypEtjj39i7YbJjAgO20mIqA== dependencies: crelt "^1.0.0" @@ -4989,32 +4993,32 @@ prosemirror-menu@^1.2.4: prosemirror-history "^1.0.0" prosemirror-state "^1.0.0" -prosemirror-model@^1.0.0, prosemirror-model@^1.18.3, prosemirror-model@^1.19.0, prosemirror-model@^1.19.4, prosemirror-model@^1.20.0, prosemirror-model@^1.21.0, prosemirror-model@^1.8.1: +prosemirror-model@^1.0.0, prosemirror-model@^1.18.3, prosemirror-model@^1.19.0, prosemirror-model@^1.19.4, prosemirror-model@^1.20.0, prosemirror-model@^1.21.0, prosemirror-model@^1.7.1, prosemirror-model@^1.8.1: version "1.21.0" - resolved "https://registry.yarnpkg.com/prosemirror-model/-/prosemirror-model-1.21.0.tgz#2d69ed04b4e7c441c3eb87c1c964fab4f9b217df" + resolved "https://registry.npmjs.org/prosemirror-model/-/prosemirror-model-1.21.0.tgz" integrity sha512-zLpS1mVCZLA7VTp82P+BfMiYVPcX1/z0Mf3gsjKZtzMWubwn2pN7CceMV0DycjlgE5JeXPR7UF4hJPbBV98oWA== dependencies: orderedmap "^2.0.0" prosemirror-schema-basic@^1.2.2: version "1.2.2" - resolved "https://registry.yarnpkg.com/prosemirror-schema-basic/-/prosemirror-schema-basic-1.2.2.tgz#6695f5175e4628aab179bf62e5568628b9cfe6c7" + resolved "https://registry.npmjs.org/prosemirror-schema-basic/-/prosemirror-schema-basic-1.2.2.tgz" integrity sha512-/dT4JFEGyO7QnNTe9UaKUhjDXbTNkiWTq/N4VpKaF79bBjSExVV2NXmJpcM7z/gD7mbqNjxbmWW5nf1iNSSGnw== dependencies: prosemirror-model "^1.19.0" prosemirror-schema-list@^1.3.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/prosemirror-schema-list/-/prosemirror-schema-list-1.3.0.tgz#05374702cf35a3ba5e7ec31079e355a488d52519" + resolved "https://registry.npmjs.org/prosemirror-schema-list/-/prosemirror-schema-list-1.3.0.tgz" integrity sha512-Hz/7gM4skaaYfRPNgr421CU4GSwotmEwBVvJh5ltGiffUJwm7C8GfN/Bc6DR1EKEp5pDKhODmdXXyi9uIsZl5A== dependencies: prosemirror-model "^1.0.0" prosemirror-state "^1.0.0" prosemirror-transform "^1.7.3" -prosemirror-state@^1.0.0, prosemirror-state@^1.2.2, prosemirror-state@^1.3.1, prosemirror-state@^1.4.3: +prosemirror-state@^1.0.0, prosemirror-state@^1.2.2, prosemirror-state@^1.2.3, prosemirror-state@^1.3.1, prosemirror-state@^1.4.2, prosemirror-state@^1.4.3: version "1.4.3" - resolved "https://registry.yarnpkg.com/prosemirror-state/-/prosemirror-state-1.4.3.tgz#94aecf3ffd54ec37e87aa7179d13508da181a080" + resolved "https://registry.npmjs.org/prosemirror-state/-/prosemirror-state-1.4.3.tgz" integrity sha512-goFKORVbvPuAQaXhpbemJFRKJ2aixr+AZMGiquiqKxaucC6hlpHNZHWgz5R7dS4roHiwq9vDctE//CZ++o0W1Q== dependencies: prosemirror-model "^1.0.0" @@ -5023,7 +5027,7 @@ prosemirror-state@^1.0.0, prosemirror-state@^1.2.2, prosemirror-state@^1.3.1, pr prosemirror-tables@^1.3.4, prosemirror-tables@^1.3.5: version "1.3.7" - resolved "https://registry.yarnpkg.com/prosemirror-tables/-/prosemirror-tables-1.3.7.tgz#9d296bd432d2bc7dca90f14e5c3b5c5f61277f7a" + resolved "https://registry.npmjs.org/prosemirror-tables/-/prosemirror-tables-1.3.7.tgz" integrity sha512-oEwX1wrziuxMtwFvdDWSFHVUWrFJWt929kVVfHvtTi8yvw+5ppxjXZkMG/fuTdFo+3DXyIPSKfid+Be1npKXDA== dependencies: prosemirror-keymap "^1.1.2" @@ -5034,7 +5038,7 @@ prosemirror-tables@^1.3.4, prosemirror-tables@^1.3.5: prosemirror-trailing-node@^2.0.7: version "2.0.8" - resolved "https://registry.yarnpkg.com/prosemirror-trailing-node/-/prosemirror-trailing-node-2.0.8.tgz#233ddcbda72de06f9b5d758d2a65a8cac482ea10" + resolved "https://registry.npmjs.org/prosemirror-trailing-node/-/prosemirror-trailing-node-2.0.8.tgz" integrity sha512-ujRYhSuhQb1Jsarh1IHqb2KoSnRiD7wAMDGucP35DN7j5af6X7B18PfdPIrbwsPTqIAj0fyOvxbuPsWhNvylmA== dependencies: "@remirror/core-constants" "^2.0.2" @@ -5042,14 +5046,14 @@ prosemirror-trailing-node@^2.0.7: prosemirror-transform@^1.0.0, prosemirror-transform@^1.1.0, prosemirror-transform@^1.2.1, prosemirror-transform@^1.7.2, prosemirror-transform@^1.7.3, prosemirror-transform@^1.8.0: version "1.9.0" - resolved "https://registry.yarnpkg.com/prosemirror-transform/-/prosemirror-transform-1.9.0.tgz#81fd1fbd887929a95369e6dd3d240c23c19313f8" + resolved "https://registry.npmjs.org/prosemirror-transform/-/prosemirror-transform-1.9.0.tgz" integrity sha512-5UXkr1LIRx3jmpXXNKDhv8OyAOeLTGuXNwdVfg8x27uASna/wQkr9p6fD3eupGOi4PLJfbezxTyi/7fSJypXHg== dependencies: prosemirror-model "^1.21.0" -prosemirror-view@^1.0.0, prosemirror-view@^1.1.0, prosemirror-view@^1.13.3, prosemirror-view@^1.27.0, prosemirror-view@^1.31.0, prosemirror-view@^1.31.4, prosemirror-view@^1.32.7: +prosemirror-view@^1.0.0, prosemirror-view@^1.1.0, prosemirror-view@^1.13.3, prosemirror-view@^1.27.0, prosemirror-view@^1.31.0, prosemirror-view@^1.31.2, prosemirror-view@^1.31.4, prosemirror-view@^1.32.7, prosemirror-view@^1.9.10: version "1.33.6" - resolved "https://registry.yarnpkg.com/prosemirror-view/-/prosemirror-view-1.33.6.tgz#85804eb922411af8e300a07f4f376722b15900b9" + resolved "https://registry.npmjs.org/prosemirror-view/-/prosemirror-view-1.33.6.tgz" integrity sha512-zRLUNgLIQfd8IfGprsXxWTjdA8xEAFJe8cDNrOptj6Mop9sj+BMeVbJvceyAYCm5G2dOdT2prctH7K9dfnpIMw== dependencies: prosemirror-model "^1.20.0" @@ -5058,27 +5062,27 @@ prosemirror-view@^1.0.0, prosemirror-view@^1.1.0, prosemirror-view@^1.13.3, pros punycode.js@^2.3.1: version "2.3.1" - resolved "https://registry.yarnpkg.com/punycode.js/-/punycode.js-2.3.1.tgz#6b53e56ad75588234e79f4affa90972c7dd8cdb7" + resolved "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz" integrity sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA== punycode@^2.1.0: version "2.3.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" + resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz" integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== pure-rand@^6.0.0: version "6.1.0" - resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-6.1.0.tgz#d173cf23258231976ccbdb05247c9787957604f2" + resolved "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz" integrity sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA== queue-microtask@^1.2.2: version "1.2.3" - resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== -react-dom@^18, react-dom@^18.2.0: +"react-dom@^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0", "react-dom@^17.0.0 || ^18.0.0", react-dom@^18, react-dom@^18.2.0, react-dom@>=16.8.0: version "18.3.1" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.3.1.tgz#c2265d79511b57d479b3dd3fdfa51536494c5cb4" + resolved "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz" integrity sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw== dependencies: loose-envify "^1.1.0" @@ -5086,34 +5090,34 @@ react-dom@^18, react-dom@^18.2.0: react-icons@^4.3.1: version "4.12.0" - resolved "https://registry.yarnpkg.com/react-icons/-/react-icons-4.12.0.tgz#54806159a966961bfd5cdb26e492f4dafd6a8d78" + resolved "https://registry.npmjs.org/react-icons/-/react-icons-4.12.0.tgz" integrity sha512-IBaDuHiShdZqmfc/TwHu6+d6k2ltNCf3AszxNmjJc1KUfXdEeRJOKyNvLmAHaarhzGmTSVygNdyu8/opXv2gaw== react-icons@^5.2.1: version "5.2.1" - resolved "https://registry.yarnpkg.com/react-icons/-/react-icons-5.2.1.tgz#28c2040917b2a2eda639b0f797bff1888e018e4a" + resolved "https://registry.npmjs.org/react-icons/-/react-icons-5.2.1.tgz" integrity sha512-zdbW5GstTzXaVKvGSyTaBalt7HSfuK5ovrzlpyiWHAFXndXTdd/1hdDHI4xBM1Mn7YriT6aqESucFl9kEXzrdw== react-is@^16.13.1: version "16.13.1" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" + resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== react-is@^18.0.0: version "18.3.1" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.3.1.tgz#e83557dc12eae63a99e003a46388b1dcbb44db7e" + resolved "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz" integrity sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg== react-number-format@^5.3.1: version "5.3.4" - resolved "https://registry.yarnpkg.com/react-number-format/-/react-number-format-5.3.4.tgz#4780522ba1fdaff20aaa0732716490c6758b8557" + resolved "https://registry.npmjs.org/react-number-format/-/react-number-format-5.3.4.tgz" integrity sha512-2hHN5mbLuCDUx19bv0Q8wet67QqYK6xmtLQeY5xx+h7UXiMmRtaCwqko4mMPoKXLc6xAzwRrutg8XbTRlsfjRg== dependencies: prop-types "^15.7.2" -react-redux@^9.1.1, react-redux@^9.1.2: +"react-redux@^7.2.1 || ^8.1.3 || ^9.0.0", react-redux@^9.1.1, react-redux@^9.1.2: version "9.1.2" - resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-9.1.2.tgz#deba38c64c3403e9abd0c3fbeab69ffd9d8a7e4b" + resolved "https://registry.npmjs.org/react-redux/-/react-redux-9.1.2.tgz" integrity sha512-0OA4dhM1W48l3uzmv6B7TXPCGmokUU4p1M44DGN2/D9a1FjVPukVjER1PcPX97jIg6aUeLq1XJo1IpfbgULn0w== dependencies: "@types/use-sync-external-store" "^0.0.3" @@ -5121,7 +5125,7 @@ react-redux@^9.1.1, react-redux@^9.1.2: react-remove-scroll-bar@^2.3.6: version "2.3.6" - resolved "https://registry.yarnpkg.com/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.6.tgz#3e585e9d163be84a010180b18721e851ac81a29c" + resolved "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.6.tgz" integrity sha512-DtSYaao4mBmX+HDo5YWYdBWQwYIQQshUV/dVxFxK+KM26Wjwp1gZ6rv6OC3oujI6Bfu6Xyg3TwK533AQutsn/g== dependencies: react-style-singleton "^2.2.1" @@ -5129,7 +5133,7 @@ react-remove-scroll-bar@^2.3.6: react-remove-scroll@^2.5.7: version "2.5.9" - resolved "https://registry.yarnpkg.com/react-remove-scroll/-/react-remove-scroll-2.5.9.tgz#6a38e7d46043abc2c6b0fb39db650b9f2e38be3e" + resolved "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.5.9.tgz" integrity sha512-bvHCLBrFfM2OgcrpPY2YW84sPdS2o2HKWJUf1xGyGLnSoEnOTOBpahIarjRuYtN0ryahCeP242yf+5TrBX/pZA== dependencies: react-remove-scroll-bar "^2.3.6" @@ -5140,7 +5144,7 @@ react-remove-scroll@^2.5.7: react-style-singleton@^2.2.1: version "2.2.1" - resolved "https://registry.yarnpkg.com/react-style-singleton/-/react-style-singleton-2.2.1.tgz#f99e420492b2d8f34d38308ff660b60d0b1205b4" + resolved "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.1.tgz" integrity sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g== dependencies: get-nonce "^1.0.0" @@ -5149,47 +5153,47 @@ react-style-singleton@^2.2.1: react-textarea-autosize@8.5.3: version "8.5.3" - resolved "https://registry.yarnpkg.com/react-textarea-autosize/-/react-textarea-autosize-8.5.3.tgz#d1e9fe760178413891484847d3378706052dd409" + resolved "https://registry.npmjs.org/react-textarea-autosize/-/react-textarea-autosize-8.5.3.tgz" integrity sha512-XT1024o2pqCuZSuBt9FwHlaDeNtVrtCXu0Rnz88t1jUGheCLa3PhjE1GH8Ctm2axEtvdCl5SUHYschyQ0L5QHQ== dependencies: "@babel/runtime" "^7.20.13" use-composed-ref "^1.3.0" use-latest "^1.2.1" -react@^18, react@^18.2.0: +react@*, "react@^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0", "react@^16.5.1 || ^17.0.0 || ^18.0.0", "react@^16.8 || ^17.0 || ^18.0", "react@^16.8.0 || ^17.0.0 || ^18.0.0", "react@^16.9.0 || ^17.0.0 || ^18", "react@^17.0.0 || ^18.0.0", react@^18, react@^18.0, react@^18.2.0, react@^18.3.1, "react@>= 16.8.0", "react@>= 16.8.0 || 17.x.x || ^18.0.0-0", react@>=16.8.0: version "18.3.1" - resolved "https://registry.yarnpkg.com/react/-/react-18.3.1.tgz#49ab892009c53933625bd16b2533fc754cab2891" + resolved "https://registry.npmjs.org/react/-/react-18.3.1.tgz" integrity sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ== dependencies: loose-envify "^1.1.0" read-cache@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/read-cache/-/read-cache-1.0.0.tgz#e664ef31161166c9751cdbe8dbcf86b5fb58f774" + resolved "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz" integrity sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA== dependencies: pify "^2.3.0" readdirp@~3.6.0: version "3.6.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz" integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== dependencies: picomatch "^2.2.1" redux-thunk@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/redux-thunk/-/redux-thunk-3.1.0.tgz#94aa6e04977c30e14e892eae84978c1af6058ff3" + resolved "https://registry.npmjs.org/redux-thunk/-/redux-thunk-3.1.0.tgz" integrity sha512-NW2r5T6ksUKXCabzhL9z+h206HQw/NJkcLm1GPImRQ8IzfXwRGqjVhKJGauHirT0DAuyy6hjdnMZaRoAcy0Klw== -redux@^5.0.1: +redux@^5.0.0, redux@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/redux/-/redux-5.0.1.tgz#97fa26881ce5746500125585d5642c77b6e9447b" + resolved "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz" integrity sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w== reflect.getprototypeof@^1.0.4: version "1.0.6" - resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz#3ab04c32a8390b770712b7a8633972702d278859" + resolved "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz" integrity sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg== dependencies: call-bind "^1.0.7" @@ -5202,12 +5206,12 @@ reflect.getprototypeof@^1.0.4: regenerator-runtime@^0.14.0: version "0.14.1" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" + resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz" integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== regexp.prototype.flags@^1.5.2: version "1.5.2" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz#138f644a3350f981a858c44f6bb1a61ff59be334" + resolved "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz" integrity sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw== dependencies: call-bind "^1.0.6" @@ -5217,7 +5221,7 @@ regexp.prototype.flags@^1.5.2: rehype-format@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/rehype-format/-/rehype-format-5.0.0.tgz#e51cc8edece2aee0e88e1efdd0625bc0cbef387b" + resolved "https://registry.npmjs.org/rehype-format/-/rehype-format-5.0.0.tgz" integrity sha512-kM4II8krCHmUhxrlvzFSptvaWh280Fr7UGNJU5DCMuvmAwGCNmGfi9CvFAQK6JDjsNoRMWQStglK3zKJH685Wg== dependencies: "@types/hast" "^3.0.0" @@ -5231,7 +5235,7 @@ rehype-format@^5.0.0: rehype-minify-whitespace@^5.0.0: version "5.0.1" - resolved "https://registry.yarnpkg.com/rehype-minify-whitespace/-/rehype-minify-whitespace-5.0.1.tgz#79729a0146aa97a9d43e1eb4b5884974e2f37e77" + resolved "https://registry.npmjs.org/rehype-minify-whitespace/-/rehype-minify-whitespace-5.0.1.tgz" integrity sha512-PPp4lWJiBPlePI/dv1BeYktbwkfgXkrK59MUa+tYbMPgleod+4DvFK2PLU0O0O60/xuhHfiR9GUIUlXTU8sRIQ== dependencies: "@types/hast" "^2.0.0" @@ -5243,7 +5247,7 @@ rehype-minify-whitespace@^5.0.0: rehype-minify-whitespace@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/rehype-minify-whitespace/-/rehype-minify-whitespace-6.0.0.tgz#fe97c5e9e48c5629458166753f2249afaa2e1fd1" + resolved "https://registry.npmjs.org/rehype-minify-whitespace/-/rehype-minify-whitespace-6.0.0.tgz" integrity sha512-i9It4YHR0Sf3GsnlR5jFUKXRr9oayvEk9GKQUkwZv6hs70OH9q3OCZrq9PpLvIGKt3W+JxBOxCidNVpH/6rWdA== dependencies: "@types/hast" "^3.0.0" @@ -5254,7 +5258,7 @@ rehype-minify-whitespace@^6.0.0: rehype-parse@^8.0.4: version "8.0.5" - resolved "https://registry.yarnpkg.com/rehype-parse/-/rehype-parse-8.0.5.tgz#ccffc21e08e288c7846614f8dc1dc23d603a4a80" + resolved "https://registry.npmjs.org/rehype-parse/-/rehype-parse-8.0.5.tgz" integrity sha512-Ds3RglaY/+clEX2U2mHflt7NlMA72KspZ0JLUJgBBLpRddBcEw3H8uYZQliQriku22NZpYMfjDdSgHcjxue24A== dependencies: "@types/hast" "^2.0.0" @@ -5264,7 +5268,7 @@ rehype-parse@^8.0.4: rehype-remark@^9.1.2: version "9.1.2" - resolved "https://registry.yarnpkg.com/rehype-remark/-/rehype-remark-9.1.2.tgz#b4ed84d7e692426c3269e72ec477906cec659c05" + resolved "https://registry.npmjs.org/rehype-remark/-/rehype-remark-9.1.2.tgz" integrity sha512-c0fG3/CrJ95zAQ07xqHSkdpZybwdsY7X5dNWvgL2XqLKZuqmG3+vk6kP/4miCnp+R+x/0uKKRSpfXb9aGR8Z5w== dependencies: "@types/hast" "^2.0.0" @@ -5274,7 +5278,7 @@ rehype-remark@^9.1.2: rehype-stringify@^9.0.3: version "9.0.4" - resolved "https://registry.yarnpkg.com/rehype-stringify/-/rehype-stringify-9.0.4.tgz#31dbb9de6f5034c6964760a1b1083218059c4343" + resolved "https://registry.npmjs.org/rehype-stringify/-/rehype-stringify-9.0.4.tgz" integrity sha512-Uk5xu1YKdqobe5XpSskwPvo1XeHUUucWEQSl8hTrXt5selvca1e8K1EZ37E6YoZ4BT8BCqCdVfQW7OfHfthtVQ== dependencies: "@types/hast" "^2.0.0" @@ -5283,7 +5287,7 @@ rehype-stringify@^9.0.3: remark-gfm@^3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/remark-gfm/-/remark-gfm-3.0.1.tgz#0b180f095e3036545e9dddac0e8df3fa5cfee54f" + resolved "https://registry.npmjs.org/remark-gfm/-/remark-gfm-3.0.1.tgz" integrity sha512-lEFDoi2PICJyNrACFOfDD3JlLkuSbOa5Wd8EPt06HUdptv8Gn0bxYTdbU/XXQ3swAPkEaGxxPN9cbnMHvVu1Ig== dependencies: "@types/mdast" "^3.0.0" @@ -5293,7 +5297,7 @@ remark-gfm@^3.0.1: remark-parse@^10.0.1: version "10.0.2" - resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-10.0.2.tgz#ca241fde8751c2158933f031a4e3efbaeb8bc262" + resolved "https://registry.npmjs.org/remark-parse/-/remark-parse-10.0.2.tgz" integrity sha512-3ydxgHa/ZQzG8LvC7jTXccARYDcRld3VfcgIIFs7bI6vbRSxJJmzgLEIIoYKyrfhaY+ujuWaf/PJiMZXoiCXgw== dependencies: "@types/mdast" "^3.0.0" @@ -5302,7 +5306,7 @@ remark-parse@^10.0.1: remark-rehype@^10.1.0: version "10.1.0" - resolved "https://registry.yarnpkg.com/remark-rehype/-/remark-rehype-10.1.0.tgz#32dc99d2034c27ecaf2e0150d22a6dcccd9a6279" + resolved "https://registry.npmjs.org/remark-rehype/-/remark-rehype-10.1.0.tgz" integrity sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw== dependencies: "@types/hast" "^2.0.0" @@ -5312,7 +5316,7 @@ remark-rehype@^10.1.0: remark-stringify@^10.0.2: version "10.0.3" - resolved "https://registry.yarnpkg.com/remark-stringify/-/remark-stringify-10.0.3.tgz#83b43f2445c4ffbb35b606f967d121b2b6d69717" + resolved "https://registry.npmjs.org/remark-stringify/-/remark-stringify-10.0.3.tgz" integrity sha512-koyOzCMYoUHudypbj4XpnAKFbkddRMYZHwghnxd7ue5210WzGw6kOBwauJTRUMq16jsovXx8dYNvSSWP89kZ3A== dependencies: "@types/mdast" "^3.0.0" @@ -5321,44 +5325,44 @@ remark-stringify@^10.0.2: require-directory@^2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== reselect@^5.1.0: version "5.1.0" - resolved "https://registry.yarnpkg.com/reselect/-/reselect-5.1.0.tgz#c479139ab9dd91be4d9c764a7f3868210ef8cd21" + resolved "https://registry.npmjs.org/reselect/-/reselect-5.1.0.tgz" integrity sha512-aw7jcGLDpSgNDyWBQLv2cedml85qd95/iszJjN988zX1t7AVRJi19d9kto5+W7oCfQ94gyo40dVbT6g2k4/kXg== resolve-cwd@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" + resolved "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz" integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== dependencies: resolve-from "^5.0.0" resolve-from@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== resolve-from@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz" integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== resolve-pkg-maps@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz#616b3dc2c57056b5588c31cdf4b3d64db133720f" + resolved "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz" integrity sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw== resolve.exports@^2.0.0: version "2.0.2" - resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-2.0.2.tgz#f8c934b8e6a13f539e38b7098e2e36134f01e800" + resolved "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz" integrity sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg== resolve@^1.1.7, resolve@^1.20.0, resolve@^1.22.2, resolve@^1.22.4: version "1.22.8" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" + resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz" integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== dependencies: is-core-module "^2.13.0" @@ -5367,7 +5371,7 @@ resolve@^1.1.7, resolve@^1.20.0, resolve@^1.22.2, resolve@^1.22.4: resolve@^2.0.0-next.5: version "2.0.0-next.5" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.5.tgz#6b0ec3107e671e52b68cd068ef327173b90dc03c" + resolved "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz" integrity sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA== dependencies: is-core-module "^2.13.0" @@ -5376,38 +5380,38 @@ resolve@^2.0.0-next.5: reusify@^1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== rimraf@^3.0.2: version "3.0.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== dependencies: glob "^7.1.3" rope-sequence@^1.3.0: version "1.3.4" - resolved "https://registry.yarnpkg.com/rope-sequence/-/rope-sequence-1.3.4.tgz#df85711aaecd32f1e756f76e43a415171235d425" + resolved "https://registry.npmjs.org/rope-sequence/-/rope-sequence-1.3.4.tgz" integrity sha512-UT5EDe2cu2E/6O4igUr5PSFs23nvvukicWHx6GnOPlHAiiYbzNuCRQCuiUdHJQcqKalLKlrYJnjY0ySGsXNQXQ== run-parallel@^1.1.9: version "1.2.0" - resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== dependencies: queue-microtask "^1.2.2" sade@^1.7.3: version "1.8.1" - resolved "https://registry.yarnpkg.com/sade/-/sade-1.8.1.tgz#0a78e81d658d394887be57d2a409bf703a3b2701" + resolved "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz" integrity sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A== dependencies: mri "^1.1.0" safe-array-concat@^1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.2.tgz#81d77ee0c4e8b863635227c721278dd524c20edb" + resolved "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz" integrity sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q== dependencies: call-bind "^1.0.7" @@ -5417,7 +5421,7 @@ safe-array-concat@^1.1.2: safe-regex-test@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.3.tgz#a5b4c0f06e0ab50ea2c395c14d8371232924c377" + resolved "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz" integrity sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw== dependencies: call-bind "^1.0.6" @@ -5426,26 +5430,33 @@ safe-regex-test@^1.0.3: scheduler@^0.23.2: version "0.23.2" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.2.tgz#414ba64a3b282892e944cf2108ecc078d115cdc3" + resolved "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz" integrity sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ== dependencies: loose-envify "^1.1.0" semver@^6.3.0, semver@^6.3.1: version "6.3.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.5.3, semver@^7.5.4: +semver@^7.5.3: version "7.6.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.0.tgz#1a46a4db4bffcccd97b743b5005c8325f23d4e2d" + resolved "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz" + integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg== + dependencies: + lru-cache "^6.0.0" + +semver@^7.5.4: + version "7.6.0" + resolved "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz" integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg== dependencies: lru-cache "^6.0.0" set-function-length@^1.2.1: version "1.2.2" - resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" + resolved "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz" integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== dependencies: define-data-property "^1.1.4" @@ -5457,7 +5468,7 @@ set-function-length@^1.2.1: set-function-name@^2.0.1, set-function-name@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.2.tgz#16a705c5a0dc2f5e638ca96d8a8cd4e1c2b90985" + resolved "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz" integrity sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ== dependencies: define-data-property "^1.1.4" @@ -5467,19 +5478,19 @@ set-function-name@^2.0.1, set-function-name@^2.0.2: shebang-command@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== dependencies: shebang-regex "^3.0.0" shebang-regex@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== side-channel@^1.0.4, side-channel@^1.0.6: version "1.0.6" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.6.tgz#abd25fb7cd24baf45466406b1096b7831c9215f2" + resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz" integrity sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA== dependencies: call-bind "^1.0.7" @@ -5489,32 +5500,32 @@ side-channel@^1.0.4, side-channel@^1.0.6: signal-exit@^3.0.3, signal-exit@^3.0.7: version "3.0.7" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== signal-exit@^4.0.1: version "4.1.0" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" + resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz" integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== sisteransi@^1.0.5: version "1.0.5" - resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" + resolved "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz" integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== slash@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== source-map-js@^1.0.2, source-map-js@^1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.0.tgz#16b809c162517b5b8c3e7dcd315a2a5c2612b2af" + resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz" integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg== source-map-support@0.5.13: version "0.5.13" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.13.tgz#31b24a9c2e73c2de85066c0feb7d44767ed52932" + resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz" integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w== dependencies: buffer-from "^1.0.0" @@ -5522,39 +5533,39 @@ source-map-support@0.5.13: source-map@^0.5.0: version "0.5.7" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz" integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== source-map@^0.6.0, source-map@^0.6.1: version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== space-separated-tokens@^2.0.0: version "2.0.2" - resolved "https://registry.yarnpkg.com/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz#1ecd9d2350a3844572c3f4a312bceb018348859f" + resolved "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz" integrity sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q== sprintf-js@~1.0.2: version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz" integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== stack-utils@^2.0.3: version "2.0.6" - resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.6.tgz#aaf0748169c02fc33c8232abccf933f54a1cc34f" + resolved "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz" integrity sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ== dependencies: escape-string-regexp "^2.0.0" streamsearch@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764" + resolved "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz" integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== string-length@^4.0.1: version "4.0.2" - resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" + resolved "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz" integrity sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ== dependencies: char-regex "^1.0.2" @@ -5562,16 +5573,25 @@ string-length@^4.0.1: "string-width-cjs@npm:string-width@^4.2.0": version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== dependencies: emoji-regex "^8.0.0" is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" -string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: +string-width@^4.1.0, string-width@^4.2.0: version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== dependencies: emoji-regex "^8.0.0" @@ -5580,7 +5600,7 @@ string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: string-width@^5.0.1, string-width@^5.1.2: version "5.1.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" + resolved "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz" integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== dependencies: eastasianwidth "^0.2.0" @@ -5589,7 +5609,7 @@ string-width@^5.0.1, string-width@^5.1.2: string.prototype.matchall@^4.0.10: version "4.0.11" - resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz#1092a72c59268d2abaad76582dccc687c0297e0a" + resolved "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz" integrity sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg== dependencies: call-bind "^1.0.7" @@ -5607,7 +5627,7 @@ string.prototype.matchall@^4.0.10: string.prototype.trim@^1.2.9: version "1.2.9" - resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz#b6fa326d72d2c78b6df02f7759c73f8f6274faa4" + resolved "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz" integrity sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw== dependencies: call-bind "^1.0.7" @@ -5617,7 +5637,7 @@ string.prototype.trim@^1.2.9: string.prototype.trimend@^1.0.8: version "1.0.8" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz#3651b8513719e8a9f48de7f2f77640b26652b229" + resolved "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz" integrity sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ== dependencies: call-bind "^1.0.7" @@ -5626,7 +5646,7 @@ string.prototype.trimend@^1.0.8: string.prototype.trimstart@^1.0.8: version "1.0.8" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz#7ee834dda8c7c17eff3118472bb35bfedaa34dde" + resolved "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz" integrity sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg== dependencies: call-bind "^1.0.7" @@ -5635,7 +5655,7 @@ string.prototype.trimstart@^1.0.8: stringify-entities@^4.0.0: version "4.0.4" - resolved "https://registry.yarnpkg.com/stringify-entities/-/stringify-entities-4.0.4.tgz#b3b79ef5f277cc4ac73caeb0236c5ba939b3a4f3" + resolved "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz" integrity sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg== dependencies: character-entities-html4 "^2.0.0" @@ -5643,55 +5663,55 @@ stringify-entities@^4.0.0: "strip-ansi-cjs@npm:strip-ansi@^6.0.1": version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== dependencies: ansi-regex "^5.0.1" strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== dependencies: ansi-regex "^5.0.1" strip-ansi@^7.0.1: version "7.1.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz" integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== dependencies: ansi-regex "^6.0.1" strip-bom@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz" integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== strip-bom@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" + resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz" integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== strip-final-newline@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + resolved "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz" integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== strip-json-comments@^3.1.1: version "3.1.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== styled-jsx@5.1.1: version "5.1.1" - resolved "https://registry.yarnpkg.com/styled-jsx/-/styled-jsx-5.1.1.tgz#839a1c3aaacc4e735fed0781b8619ea5d0009d1f" + resolved "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz" integrity sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw== dependencies: client-only "0.0.1" sucrase@^3.32.0: version "3.35.0" - resolved "https://registry.yarnpkg.com/sucrase/-/sucrase-3.35.0.tgz#57f17a3d7e19b36d8995f06679d121be914ae263" + resolved "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz" integrity sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA== dependencies: "@jridgewell/gen-mapping" "^0.3.2" @@ -5704,33 +5724,33 @@ sucrase@^3.32.0: supports-color@^5.3.0: version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== dependencies: has-flag "^3.0.0" supports-color@^7.1.0: version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== dependencies: has-flag "^4.0.0" supports-color@^8.0.0: version "8.1.1" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz" integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== dependencies: has-flag "^4.0.0" supports-preserve-symlinks-flag@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== synckit@^0.8.6: version "0.8.8" - resolved "https://registry.yarnpkg.com/synckit/-/synckit-0.8.8.tgz#fe7fe446518e3d3d49f5e429f443cf08b6edfcd7" + resolved "https://registry.npmjs.org/synckit/-/synckit-0.8.8.tgz" integrity sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ== dependencies: "@pkgr/core" "^0.1.0" @@ -5738,24 +5758,24 @@ synckit@^0.8.6: tabbable@^6.0.0: version "6.2.0" - resolved "https://registry.yarnpkg.com/tabbable/-/tabbable-6.2.0.tgz#732fb62bc0175cfcec257330be187dcfba1f3b97" + resolved "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz" integrity sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew== tailwind-merge@^2.3.0: version "2.3.0" - resolved "https://registry.yarnpkg.com/tailwind-merge/-/tailwind-merge-2.3.0.tgz#27d2134fd00a1f77eca22bcaafdd67055917d286" + resolved "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-2.3.0.tgz" integrity sha512-vkYrLpIP+lgR0tQCG6AP7zZXCTLc1Lnv/CCRT3BqJ9CZ3ui2++GPaGb1x/ILsINIMSYqqvrpqjUFsMNLlW99EA== dependencies: "@babel/runtime" "^7.24.1" tailwindcss-animate@^1.0.7: version "1.0.7" - resolved "https://registry.yarnpkg.com/tailwindcss-animate/-/tailwindcss-animate-1.0.7.tgz#318b692c4c42676cc9e67b19b78775742388bef4" + resolved "https://registry.npmjs.org/tailwindcss-animate/-/tailwindcss-animate-1.0.7.tgz" integrity sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA== -tailwindcss@^3.4.1: +tailwindcss@^3.4.1, "tailwindcss@>=3.0.0 || insiders": version "3.4.3" - resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-3.4.3.tgz#be48f5283df77dfced705451319a5dffb8621519" + resolved "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.3.tgz" integrity sha512-U7sxQk/n397Bmx4JHbJx/iSOOv5G+II3f1kpLpY2QeUv5DcPdcTsYLlusZfq1NthHS1c1cZoyFmmkex1rzke0A== dependencies: "@alloc/quick-lru" "^5.2.0" @@ -5783,12 +5803,12 @@ tailwindcss@^3.4.1: tapable@^2.2.0: version "2.2.1" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" + resolved "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz" integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== test-exclude@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" + resolved "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz" integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== dependencies: "@istanbuljs/schema" "^0.1.2" @@ -5797,75 +5817,89 @@ test-exclude@^6.0.0: text-table@^0.2.0: version "0.2.0" - resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== thenify-all@^1.0.0: version "1.6.0" - resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" + resolved "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz" integrity sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA== dependencies: thenify ">= 3.1.0 < 4" "thenify@>= 3.1.0 < 4": version "3.3.1" - resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.3.1.tgz#8932e686a4066038a016dd9e2ca46add9838a95f" + resolved "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz" integrity sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw== dependencies: any-promise "^1.0.0" tippy.js@^6.3.7: version "6.3.7" - resolved "https://registry.yarnpkg.com/tippy.js/-/tippy.js-6.3.7.tgz#8ccfb651d642010ed9a32ff29b0e9e19c5b8c61c" + resolved "https://registry.npmjs.org/tippy.js/-/tippy.js-6.3.7.tgz" integrity sha512-E1d3oP2emgJ9dRQZdf3Kkn0qJgI6ZLpyS5z6ZkY1DF3kaQaBsGZsndEpHwx+eC+tYM41HaSNvNtLx8tU57FzTQ== dependencies: "@popperjs/core" "^2.9.0" tmpl@1.0.5: version "1.0.5" - resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" + resolved "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz" integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== to-fast-properties@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + resolved "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz" integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== to-regex-range@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== dependencies: is-number "^7.0.0" trim-lines@^3.0.0: version "3.0.1" - resolved "https://registry.yarnpkg.com/trim-lines/-/trim-lines-3.0.1.tgz#d802e332a07df861c48802c04321017b1bd87338" + resolved "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz" integrity sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg== trim-trailing-lines@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/trim-trailing-lines/-/trim-trailing-lines-2.1.0.tgz#9aac7e89b09cb35badf663de7133c6de164f86df" + resolved "https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-2.1.0.tgz" integrity sha512-5UR5Biq4VlVOtzqkm2AZlgvSlDJtME46uV0br0gENbwN4l5+mMKT4b9gJKqWtuL2zAIqajGJGuvbCbcAJUZqBg== trough@^2.0.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/trough/-/trough-2.2.0.tgz#94a60bd6bd375c152c1df911a4b11d5b0256f50f" + resolved "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz" integrity sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw== ts-api-utils@^1.0.1: version "1.3.0" - resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.3.0.tgz#4b490e27129f1e8e686b45cc4ab63714dc60eea1" + resolved "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz" integrity sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ== ts-interface-checker@^0.1.9: version "0.1.13" - resolved "https://registry.yarnpkg.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz#784fd3d679722bc103b1b4b8030bcddb5db2a699" + resolved "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz" integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA== +ts-jest@^29.1.2: + version "29.1.2" + resolved "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.2.tgz" + integrity sha512-br6GJoH/WUX4pu7FbZXuWGKGNDuU7b8Uj77g/Sp7puZV6EXzuByl6JrECvm0MzVzSTkSHWTihsXt+5XYER5b+g== + dependencies: + bs-logger "0.x" + fast-json-stable-stringify "2.x" + jest-util "^29.0.0" + json5 "^2.2.3" + lodash.memoize "4.x" + make-error "1.x" + semver "^7.5.3" + yargs-parser "^21.0.1" + tsconfig-paths@^3.15.0: version "3.15.0" - resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz#5299ec605e55b1abb23ec939ef15edaf483070d4" + resolved "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz" integrity sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg== dependencies: "@types/json5" "^0.0.29" @@ -5875,39 +5909,39 @@ tsconfig-paths@^3.15.0: tslib@^2.0.0, tslib@^2.1.0, tslib@^2.4.0, tslib@^2.6.2: version "2.6.2" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" + resolved "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz" integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== type-check@^0.4.0, type-check@~0.4.0: version "0.4.0" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + resolved "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz" integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== dependencies: prelude-ls "^1.2.1" type-detect@4.0.8: version "4.0.8" - resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" + resolved "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz" integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== type-fest@^0.20.2: version "0.20.2" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz" integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== type-fest@^0.21.3: version "0.21.3" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz" integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== type-fest@^4.12.0: version "4.18.2" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-4.18.2.tgz#8d765c42e7280a11f4d04fb77a00dacc417c8b05" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-4.18.2.tgz" integrity sha512-+suCYpfJLAe4OXS6+PPXjW3urOS4IoP9waSiLuXfLgqZODKw/aWwASvzqE886wA0kQgGy0mIWyhd87VpqIy6Xg== typed-array-buffer@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz#1867c5d83b20fcb5ccf32649e5e2fc7424474ff3" + resolved "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz" integrity sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ== dependencies: call-bind "^1.0.7" @@ -5916,7 +5950,7 @@ typed-array-buffer@^1.0.2: typed-array-byte-length@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz#d92972d3cff99a3fa2e765a28fcdc0f1d89dec67" + resolved "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz" integrity sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw== dependencies: call-bind "^1.0.7" @@ -5927,7 +5961,7 @@ typed-array-byte-length@^1.0.1: typed-array-byte-offset@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz#f9ec1acb9259f395093e4567eb3c28a580d02063" + resolved "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz" integrity sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA== dependencies: available-typed-arrays "^1.0.7" @@ -5939,7 +5973,7 @@ typed-array-byte-offset@^1.0.2: typed-array-length@^1.0.6: version "1.0.6" - resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.6.tgz#57155207c76e64a3457482dfdc1c9d1d3c4c73a3" + resolved "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz" integrity sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g== dependencies: call-bind "^1.0.7" @@ -5949,19 +5983,19 @@ typed-array-length@^1.0.6: is-typed-array "^1.1.13" possible-typed-array-names "^1.0.0" -typescript@5.4.5: +typescript@>=3.3.1, typescript@>=4.2.0, "typescript@>=4.3 <6", typescript@5.4.5: version "5.4.5" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.4.5.tgz#42ccef2c571fdbd0f6718b1d1f5e6e5ef006f611" + resolved "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz" integrity sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ== uc.micro@^2.0.0, uc.micro@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-2.1.0.tgz#f8d3f7d0ec4c3dea35a7e3c8efa4cb8b45c9e7ee" + resolved "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz" integrity sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A== unbox-primitive@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" + resolved "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz" integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== dependencies: call-bind "^1.0.2" @@ -5971,12 +6005,12 @@ unbox-primitive@^1.0.2: undici-types@~5.26.4: version "5.26.5" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" + resolved "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz" integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== unified@^10.0.0, unified@^10.1.2: version "10.1.2" - resolved "https://registry.yarnpkg.com/unified/-/unified-10.1.2.tgz#b1d64e55dafe1f0b98bb6c719881103ecf6c86df" + resolved "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz" integrity sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q== dependencies: "@types/unist" "^2.0.0" @@ -5989,7 +6023,7 @@ unified@^10.0.0, unified@^10.1.2: unist-util-find-after@^4.0.0: version "4.0.1" - resolved "https://registry.yarnpkg.com/unist-util-find-after/-/unist-util-find-after-4.0.1.tgz#80c69c92b0504033638ce11973f4135f2c822e2d" + resolved "https://registry.npmjs.org/unist-util-find-after/-/unist-util-find-after-4.0.1.tgz" integrity sha512-QO/PuPMm2ERxC6vFXEPtmAutOopy5PknD+Oq64gGwxKtk4xwo9Z97t9Av1obPmGU0IyTa6EKYUfTrK2QJS3Ozw== dependencies: "@types/unist" "^2.0.0" @@ -5997,40 +6031,40 @@ unist-util-find-after@^4.0.0: unist-util-generated@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/unist-util-generated/-/unist-util-generated-2.0.1.tgz#e37c50af35d3ed185ac6ceacb6ca0afb28a85cae" + resolved "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-2.0.1.tgz" integrity sha512-qF72kLmPxAw0oN2fwpWIqbXAVyEqUzDHMsbtPvOudIlUzXYFIeQIuxXQCRCFh22B7cixvU0MG7m3MW8FTq/S+A== unist-util-is@^5.0.0: version "5.2.1" - resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-5.2.1.tgz#b74960e145c18dcb6226bc57933597f5486deae9" + resolved "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.1.tgz" integrity sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw== dependencies: "@types/unist" "^2.0.0" unist-util-is@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-6.0.0.tgz#b775956486aff107a9ded971d996c173374be424" + resolved "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz" integrity sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw== dependencies: "@types/unist" "^3.0.0" unist-util-position@^4.0.0: version "4.0.4" - resolved "https://registry.yarnpkg.com/unist-util-position/-/unist-util-position-4.0.4.tgz#93f6d8c7d6b373d9b825844645877c127455f037" + resolved "https://registry.npmjs.org/unist-util-position/-/unist-util-position-4.0.4.tgz" integrity sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg== dependencies: "@types/unist" "^2.0.0" unist-util-stringify-position@^3.0.0: version "3.0.3" - resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz#03ad3348210c2d930772d64b489580c13a7db39d" + resolved "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz" integrity sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg== dependencies: "@types/unist" "^2.0.0" unist-util-visit-parents@^5.0.0, unist-util-visit-parents@^5.1.1: version "5.1.3" - resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz#b4520811b0ca34285633785045df7a8d6776cfeb" + resolved "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz" integrity sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg== dependencies: "@types/unist" "^2.0.0" @@ -6038,7 +6072,7 @@ unist-util-visit-parents@^5.0.0, unist-util-visit-parents@^5.1.1: unist-util-visit-parents@^6.0.0: version "6.0.1" - resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz#4d5f85755c3b8f0dc69e21eca5d6d82d22162815" + resolved "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz" integrity sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw== dependencies: "@types/unist" "^3.0.0" @@ -6046,7 +6080,7 @@ unist-util-visit-parents@^6.0.0: unist-util-visit@^4.0.0: version "4.1.2" - resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-4.1.2.tgz#125a42d1eb876283715a3cb5cceaa531828c72e2" + resolved "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz" integrity sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg== dependencies: "@types/unist" "^2.0.0" @@ -6055,7 +6089,7 @@ unist-util-visit@^4.0.0: update-browserslist-db@^1.0.13: version "1.0.15" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.15.tgz#60ed9f8cba4a728b7ecf7356f641a31e3a691d97" + resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.15.tgz" integrity sha512-K9HWH62x3/EalU1U6sjSZiylm9C8tgq2mSvshZpqc7QE69RaA2qjhkW2HlNA0tFpEbtyFz7HTqbSdN4MSwUodA== dependencies: escalade "^3.1.2" @@ -6063,43 +6097,43 @@ update-browserslist-db@^1.0.13: uri-js@^4.2.2: version "4.4.1" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== dependencies: punycode "^2.1.0" use-callback-ref@^1.3.0: version "1.3.2" - resolved "https://registry.yarnpkg.com/use-callback-ref/-/use-callback-ref-1.3.2.tgz#6134c7f6ff76e2be0b56c809b17a650c942b1693" + resolved "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.2.tgz" integrity sha512-elOQwe6Q8gqZgDA8mrh44qRTQqpIHDcZ3hXTLjBe1i4ph8XpNJnO+aQf3NaG+lriLopI4HMx9VjQLfPQ6vhnoA== dependencies: tslib "^2.0.0" use-composed-ref@^1.3.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/use-composed-ref/-/use-composed-ref-1.3.0.tgz#3d8104db34b7b264030a9d916c5e94fbe280dbda" + resolved "https://registry.npmjs.org/use-composed-ref/-/use-composed-ref-1.3.0.tgz" integrity sha512-GLMG0Jc/jiKov/3Ulid1wbv3r54K9HlMW29IWcDFPEqFkSO2nS0MuefWgMJpeHQ9YJeXDL3ZUF+P3jdXlZX/cQ== use-isomorphic-layout-effect@^1.1.1: version "1.1.2" - resolved "https://registry.yarnpkg.com/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz#497cefb13d863d687b08477d9e5a164ad8c1a6fb" + resolved "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz" integrity sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA== use-latest@^1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/use-latest/-/use-latest-1.2.1.tgz#d13dfb4b08c28e3e33991546a2cee53e14038cf2" + resolved "https://registry.npmjs.org/use-latest/-/use-latest-1.2.1.tgz" integrity sha512-xA+AVm/Wlg3e2P/JiItTziwS7FK92LWrDB0p+hgXloIMuVCeJJ8v6f0eeHyPZaJrM+usM1FkFfbNCrJGs8A/zw== dependencies: use-isomorphic-layout-effect "^1.1.1" use-prefers-color-scheme@^1.1.3: version "1.1.3" - resolved "https://registry.yarnpkg.com/use-prefers-color-scheme/-/use-prefers-color-scheme-1.1.3.tgz#18945cecbe33566f961fac1b90c079d1ce2d10b5" + resolved "https://registry.npmjs.org/use-prefers-color-scheme/-/use-prefers-color-scheme-1.1.3.tgz" integrity sha512-ZRgDfb5BFLum/Sud4SpZ+d1YcV+lRbsupw0qQ/rGy5kGrpE3KMUQgEQOKiQQSa4Wslex46n5fKFO+9FGMTosUQ== use-sidecar@^1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/use-sidecar/-/use-sidecar-1.1.2.tgz#2f43126ba2d7d7e117aa5855e5d8f0276dfe73c2" + resolved "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.2.tgz" integrity sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw== dependencies: detect-node-es "^1.1.0" @@ -6107,22 +6141,22 @@ use-sidecar@^1.1.2: use-sync-external-store@^1.0.0: version "1.2.2" - resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.2.2.tgz#c3b6390f3a30eba13200d2302dcdf1e7b57b2ef9" + resolved "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.2.tgz" integrity sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw== util-deprecate@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== uuid@^8.3.2: version "8.3.2" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + resolved "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== uvu@^0.5.0: version "0.5.6" - resolved "https://registry.yarnpkg.com/uvu/-/uvu-0.5.6.tgz#2754ca20bcb0bb59b64e9985e84d2e81058502df" + resolved "https://registry.npmjs.org/uvu/-/uvu-0.5.6.tgz" integrity sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA== dependencies: dequal "^2.0.0" @@ -6132,7 +6166,7 @@ uvu@^0.5.0: v8-to-istanbul@^9.0.1: version "9.2.0" - resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.2.0.tgz#2ed7644a245cddd83d4e087b9b33b3e62dfd10ad" + resolved "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.2.0.tgz" integrity sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA== dependencies: "@jridgewell/trace-mapping" "^0.3.12" @@ -6141,7 +6175,7 @@ v8-to-istanbul@^9.0.1: vfile-location@^4.0.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/vfile-location/-/vfile-location-4.1.0.tgz#69df82fb9ef0a38d0d02b90dd84620e120050dd0" + resolved "https://registry.npmjs.org/vfile-location/-/vfile-location-4.1.0.tgz" integrity sha512-YF23YMyASIIJXpktBa4vIGLJ5Gs88UB/XePgqPmTa7cDA+JeO3yclbpheQYCHjVHBn/yePzrXuygIL+xbvRYHw== dependencies: "@types/unist" "^2.0.0" @@ -6149,7 +6183,7 @@ vfile-location@^4.0.0: vfile-message@^3.0.0: version "3.1.4" - resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-3.1.4.tgz#15a50816ae7d7c2d1fa87090a7f9f96612b59dea" + resolved "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz" integrity sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw== dependencies: "@types/unist" "^2.0.0" @@ -6157,7 +6191,7 @@ vfile-message@^3.0.0: vfile@^5.0.0: version "5.3.7" - resolved "https://registry.yarnpkg.com/vfile/-/vfile-5.3.7.tgz#de0677e6683e3380fafc46544cfe603118826ab7" + resolved "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz" integrity sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g== dependencies: "@types/unist" "^2.0.0" @@ -6167,24 +6201,24 @@ vfile@^5.0.0: w3c-keyname@^2.2.0: version "2.2.8" - resolved "https://registry.yarnpkg.com/w3c-keyname/-/w3c-keyname-2.2.8.tgz#7b17c8c6883d4e8b86ac8aba79d39e880f8869c5" + resolved "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz" integrity sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ== walker@^1.0.8: version "1.0.8" - resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" + resolved "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz" integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== dependencies: makeerror "1.0.12" web-namespaces@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/web-namespaces/-/web-namespaces-2.0.1.tgz#1010ff7c650eccb2592cebeeaf9a1b253fd40692" + resolved "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz" integrity sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ== which-boxed-primitive@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" + resolved "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz" integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== dependencies: is-bigint "^1.0.1" @@ -6195,7 +6229,7 @@ which-boxed-primitive@^1.0.2: which-builtin-type@^1.1.3: version "1.1.3" - resolved "https://registry.yarnpkg.com/which-builtin-type/-/which-builtin-type-1.1.3.tgz#b1b8443707cc58b6e9bf98d32110ff0c2cbd029b" + resolved "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.3.tgz" integrity sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw== dependencies: function.prototype.name "^1.1.5" @@ -6213,7 +6247,7 @@ which-builtin-type@^1.1.3: which-collection@^1.0.1: version "1.0.2" - resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.2.tgz#627ef76243920a107e7ce8e96191debe4b16c2a0" + resolved "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz" integrity sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw== dependencies: is-map "^2.0.3" @@ -6223,7 +6257,7 @@ which-collection@^1.0.1: which-typed-array@^1.1.14, which-typed-array@^1.1.15, which-typed-array@^1.1.9: version "1.1.15" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.15.tgz#264859e9b11a649b388bfaaf4f767df1f779b38d" + resolved "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz" integrity sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA== dependencies: available-typed-arrays "^1.0.7" @@ -6234,19 +6268,19 @@ which-typed-array@^1.1.14, which-typed-array@^1.1.15, which-typed-array@^1.1.9: which@^2.0.1: version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== dependencies: isexe "^2.0.0" word-wrap@^1.2.5: version "1.2.5" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" + resolved "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz" integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== "wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== dependencies: ansi-styles "^4.0.0" @@ -6255,7 +6289,7 @@ word-wrap@^1.2.5: wrap-ansi@^7.0.0: version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== dependencies: ansi-styles "^4.0.0" @@ -6264,7 +6298,7 @@ wrap-ansi@^7.0.0: wrap-ansi@^8.1.0: version "8.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz" integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== dependencies: ansi-styles "^6.1.0" @@ -6273,59 +6307,59 @@ wrap-ansi@^8.1.0: wrappy@1: version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== write-file-atomic@^4.0.2: version "4.0.2" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-4.0.2.tgz#a9df01ae5b77858a027fd2e80768ee433555fcfd" + resolved "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz" integrity sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg== dependencies: imurmurhash "^0.1.4" signal-exit "^3.0.7" -y-prosemirror@1.2.1: +y-prosemirror@^1.2.1, y-prosemirror@1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/y-prosemirror/-/y-prosemirror-1.2.1.tgz#a8b5c50b8fd445e556dfa831f295765f4ca022bd" + resolved "https://registry.npmjs.org/y-prosemirror/-/y-prosemirror-1.2.1.tgz" integrity sha512-czMBfB1eL2awqmOSxQM8cS/fsUOGE6fjvyPLInrh4crPxFiw67wDpwIW+EGBYKRa04sYbS0ScGj7ZgvWuDrmBQ== dependencies: lib0 "^0.2.42" -y-protocols@^1.0.5: +y-protocols@^1.0.1, y-protocols@^1.0.5: version "1.0.6" - resolved "https://registry.yarnpkg.com/y-protocols/-/y-protocols-1.0.6.tgz#66dad8a95752623443e8e28c0e923682d2c0d495" + resolved "https://registry.npmjs.org/y-protocols/-/y-protocols-1.0.6.tgz" integrity sha512-vHRF2L6iT3rwj1jub/K5tYcTT/mEYDUppgNPXwp8fmLpui9f7Yeq3OEtTLVF012j39QnV+KEQpNqoN7CWU7Y9Q== dependencies: lib0 "^0.2.85" y18n@^5.0.5: version "5.0.8" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + resolved "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz" integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== yallist@^3.0.2: version "3.1.1" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + resolved "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== yallist@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== yaml@^2.3.4: version "2.4.2" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.4.2.tgz#7a2b30f2243a5fc299e1f14ca58d475ed4bc5362" + resolved "https://registry.npmjs.org/yaml/-/yaml-2.4.2.tgz" integrity sha512-B3VqDZ+JAg1nZpaEmWtTXUlBneoGx6CPM9b0TENK6aoSu5t73dItudwdgmi6tHlIZZId4dZ9skcAQ2UbcyAeVA== -yargs-parser@^21.1.1: +yargs-parser@^21.0.1, yargs-parser@^21.1.1: version "21.1.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz" integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== yargs@^17.3.1: version "17.7.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" + resolved "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz" integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== dependencies: cliui "^8.0.1" @@ -6336,24 +6370,29 @@ yargs@^17.3.1: y18n "^5.0.5" yargs-parser "^21.1.1" -yjs@^13.6.1: +yjs@^13.0.0, yjs@^13.5.38, yjs@^13.6.1: version "13.6.15" - resolved "https://registry.yarnpkg.com/yjs/-/yjs-13.6.15.tgz#5a2402632aabf83e5baf56342b4c82fe40859306" + resolved "https://registry.npmjs.org/yjs/-/yjs-13.6.15.tgz" integrity sha512-moFv4uNYhp8BFxIk3AkpoAnnjts7gwdpiG8RtyFiKbMtxKCS0zVZ5wPaaGpwC3V2N/K8TK8MwtSI3+WO9CHWjQ== dependencies: lib0 "^0.2.86" yocto-queue@^0.1.0: version "0.1.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== -zod@^3.23.6, zod@^3.23.8: +zod@^3.23.6: + version "3.23.7" + resolved "https://registry.npmjs.org/zod/-/zod-3.23.7.tgz" + integrity sha512-NBeIoqbtOiUMomACV/y+V3Qfs9+Okr18vR5c/5pHClPpufWOrsx8TENboDPe265lFdfewX2yBtNTLPvnmCxwog== + +zod@^3.23.8: version "3.23.8" - resolved "https://registry.yarnpkg.com/zod/-/zod-3.23.8.tgz#e37b957b5d52079769fb8097099b592f0ef4067d" + resolved "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz" integrity sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g== zwitch@^2.0.0, zwitch@^2.0.4: version "2.0.4" - resolved "https://registry.yarnpkg.com/zwitch/-/zwitch-2.0.4.tgz#c827d4b0acb76fc3e685a4c6ec2902d51070e9d7" + resolved "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz" integrity sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A== From cf1e04e002b628e846cd6e664690a0e2dcd24c91 Mon Sep 17 00:00:00 2001 From: Garrett Ladley <92384606+garrettladley@users.noreply.github.com> Date: Thu, 16 May 2024 23:59:00 -0400 Subject: [PATCH 04/28] fix: events overhaul (#745) --- backend/config/calendar.go | 24 ++ backend/config/config.go | 24 +- backend/config/local.go | 6 +- backend/config/production.go | 10 +- backend/entities/auth/base/service.go | 2 +- backend/entities/categories/base/service.go | 4 +- backend/entities/clubs/base/routes.go | 12 +- backend/entities/clubs/base/service.go | 4 +- backend/entities/clubs/contact/routes.go | 7 +- backend/entities/clubs/contact/service.go | 2 +- backend/entities/clubs/member/routes.go | 13 +- backend/entities/clubs/poc/routes.go | 25 +- backend/entities/clubs/tag/routes.go | 13 +- backend/entities/clubs/tag/transactions.go | 8 +- backend/entities/events/base/controller.go | 261 +--------------- backend/entities/events/base/routes.go | 36 ++- backend/entities/events/base/service.go | 211 +------------ backend/entities/events/base/transactions.go | 217 ++----------- backend/entities/events/series/controller.go | 47 +++ backend/entities/events/series/models.go | 49 +++ backend/entities/events/series/routes.go | 32 ++ backend/entities/events/series/service.go | 78 +++++ .../entities/events/series/transactions.go | 76 +++++ backend/entities/events/tags/controller.go | 48 +++ backend/entities/events/tags/models.go | 7 + backend/entities/events/tags/routes.go | 24 ++ backend/entities/events/tags/service.go | 63 ++++ backend/entities/events/tags/transactions.go | 56 ++++ backend/entities/events/transactions.go | 51 +++ backend/entities/models/club.go | 3 +- backend/entities/models/event.go | 153 +++++---- backend/entities/tags/base/service.go | 4 +- backend/entities/users/base/service.go | 2 +- backend/extractors/series.go | 16 + backend/go.mod | 3 +- backend/go.sum | 2 + backend/main.go | 10 +- backend/middleware/auth.go | 44 +-- backend/middleware/club.go | 70 +++-- backend/middleware/event.go | 49 +++ backend/middleware/extractor.go | 81 +++++ backend/middleware/user.go | 58 ++-- backend/migrations/000001_init.down.sql | 6 +- backend/migrations/000001_init.up.sql | 45 ++- backend/protos/recurrence.go | 291 ++++++++++++++++++ backend/server/server.go | 3 +- backend/tests/domain/recurrence_test.go | 63 ++++ backend/types/params.go | 1 + backend/utilities/manipulator.go | 21 +- cli/cmd/lint.go | 4 +- config/local.yml | 4 +- 51 files changed, 1439 insertions(+), 904 deletions(-) create mode 100644 backend/config/calendar.go create mode 100644 backend/entities/events/series/controller.go create mode 100644 backend/entities/events/series/models.go create mode 100644 backend/entities/events/series/routes.go create mode 100644 backend/entities/events/series/service.go create mode 100644 backend/entities/events/series/transactions.go create mode 100644 backend/entities/events/tags/controller.go create mode 100644 backend/entities/events/tags/models.go create mode 100644 backend/entities/events/tags/routes.go create mode 100644 backend/entities/events/tags/service.go create mode 100644 backend/entities/events/tags/transactions.go create mode 100644 backend/entities/events/transactions.go create mode 100644 backend/extractors/series.go create mode 100644 backend/middleware/event.go create mode 100644 backend/middleware/extractor.go create mode 100644 backend/protos/recurrence.go create mode 100644 backend/tests/domain/recurrence_test.go diff --git a/backend/config/calendar.go b/backend/config/calendar.go new file mode 100644 index 000000000..f131b056c --- /dev/null +++ b/backend/config/calendar.go @@ -0,0 +1,24 @@ +package config + +import ( + "time" +) + +type CalendarSettings struct { + MaxTerminationDate time.Time +} + +type intermediateCalendarSettings struct { + MaxTerminationDate string `yaml:"maxterminationdate"` +} + +func (int *intermediateCalendarSettings) into() (*CalendarSettings, error) { + t, err := time.Parse("01-02-2006", int.MaxTerminationDate) + if err != nil { + return nil, err + } + + return &CalendarSettings{ + MaxTerminationDate: t, + }, nil +} diff --git a/backend/config/config.go b/backend/config/config.go index d8814e787..ff19ecb23 100644 --- a/backend/config/config.go +++ b/backend/config/config.go @@ -8,14 +8,15 @@ import ( ) type Settings struct { - Application ApplicationSettings - Database DatabaseSettings - SuperUser SuperUserSettings - Auth AuthSettings - AWS AWSSettings - PineconeSettings PineconeSettings - OpenAISettings OpenAISettings - ResendSettings ResendSettings + Application ApplicationSettings + Database DatabaseSettings + SuperUser SuperUserSettings + Auth AuthSettings + AWS AWSSettings + Pinecone PineconeSettings + OpenAI OpenAISettings + Resend ResendSettings + Calendar CalendarSettings } type intermediateSettings struct { @@ -23,6 +24,7 @@ type intermediateSettings struct { Database intermediateDatabaseSettings `yaml:"database"` SuperUser intermediateSuperUserSettings `yaml:"superuser"` Auth intermediateAuthSettings `yaml:"authsecret"` + Calendar intermediateCalendarSettings `yaml:"calendar"` } func (int *intermediateSettings) into() (*Settings, error) { @@ -41,11 +43,17 @@ func (int *intermediateSettings) into() (*Settings, error) { return nil, err } + calendarSettings, err := int.Calendar.into() + if err != nil { + return nil, err + } + return &Settings{ Application: int.Application, Database: *databaseSettings, SuperUser: *superUserSettings, Auth: *authSettings, + Calendar: *calendarSettings, }, nil } diff --git a/backend/config/local.go b/backend/config/local.go index 301c4306a..864140f4f 100644 --- a/backend/config/local.go +++ b/backend/config/local.go @@ -42,14 +42,14 @@ func readLocal(v *viper.Viper, path string, useDevDotEnv bool) (*Settings, error return nil, fmt.Errorf("failed to read Pinecone settings: %w", err) } - settings.PineconeSettings = *pineconeSettings + settings.Pinecone = *pineconeSettings openAISettings, err := readOpenAISettings() if err != nil { return nil, fmt.Errorf("failed to read OpenAI settings: %w", err) } - settings.OpenAISettings = *openAISettings + settings.OpenAI = *openAISettings awsSettings, err := readAWSSettings() if err != nil { @@ -63,7 +63,7 @@ func readLocal(v *viper.Viper, path string, useDevDotEnv bool) (*Settings, error return nil, fmt.Errorf("failed to read Resend settings: %w", err) } - settings.ResendSettings = *resendSettings + settings.Resend = *resendSettings return settings, nil } diff --git a/backend/config/production.go b/backend/config/production.go index 9e441ce69..43e10f0f4 100644 --- a/backend/config/production.go +++ b/backend/config/production.go @@ -14,6 +14,7 @@ import ( type ProductionSettings struct { Database ProductionDatabaseSettings `yaml:"database"` Application ProductionApplicationSettings `yaml:"application"` + Calendar CalendarSettings `yaml:"calendar"` } type ProductionDatabaseSettings struct { @@ -118,9 +119,10 @@ func readProd(v *viper.Viper) (*Settings, error) { AccessKey: authAccessKey, RefreshKey: authRefreshKey, }, - PineconeSettings: *pineconeSettings, - OpenAISettings: *openAISettings, - AWS: *awsSettings, - ResendSettings: *resendSettings, + Pinecone: *pineconeSettings, + OpenAI: *openAISettings, + AWS: *awsSettings, + Resend: *resendSettings, + Calendar: prodSettings.Calendar, }, nil } diff --git a/backend/entities/auth/base/service.go b/backend/entities/auth/base/service.go index 44b68a982..ae448c390 100644 --- a/backend/entities/auth/base/service.go +++ b/backend/entities/auth/base/service.go @@ -89,7 +89,7 @@ func (a *AuthService) Register(userBody models.CreateUserRequestBody) (*models.U return nil, nil, err } - user, err := utilities.MapRequestToModel(userBody, &models.User{}) + user, err := utilities.MapJsonTags(userBody, &models.User{}) if err != nil { return nil, nil, err } diff --git a/backend/entities/categories/base/service.go b/backend/entities/categories/base/service.go index 70c2ecf2d..719aff104 100644 --- a/backend/entities/categories/base/service.go +++ b/backend/entities/categories/base/service.go @@ -31,7 +31,7 @@ func (c *CategoryService) CreateCategory(categoryBody models.CategoryRequestBody return nil, err } - category, err := utilities.MapRequestToModel(categoryBody, &models.Category{}) + category, err := utilities.MapJsonTags(categoryBody, &models.Category{}) if err != nil { return nil, err } @@ -64,7 +64,7 @@ func (c *CategoryService) UpdateCategory(id string, categoryBody models.Category return nil, err } - category, err := utilities.MapRequestToModel(categoryBody, &models.Category{}) + category, err := utilities.MapJsonTags(categoryBody, &models.Category{}) if err != nil { return nil, err } diff --git a/backend/entities/clubs/base/routes.go b/backend/entities/clubs/base/routes.go index 67a04d6a7..90fbfc9f0 100644 --- a/backend/entities/clubs/base/routes.go +++ b/backend/entities/clubs/base/routes.go @@ -8,6 +8,7 @@ import ( "github.com/GenerateNU/sac/backend/entities/clubs/member" "github.com/GenerateNU/sac/backend/entities/clubs/poc" "github.com/GenerateNU/sac/backend/entities/clubs/tag" + "github.com/GenerateNU/sac/backend/middleware" "github.com/garrettladley/fiberpaginate" "github.com/GenerateNU/sac/backend/types" @@ -15,10 +16,7 @@ import ( ) func ClubRoutes(clubParams types.RouteParams) { - clubIDRouter := ClubRouter(clubParams) - - // update the router in params - clubParams.Router = clubIDRouter + clubParams.Router = ClubRouter(clubParams) tag.ClubTag(clubParams) follower.ClubFollower(clubParams) @@ -41,7 +39,11 @@ func ClubRouter(clubParams types.RouteParams) fiber.Router { clubID := clubs.Group("/:clubID") clubID.Get("/", clubController.GetClub) - clubID.Patch("/", clubParams.AuthMiddleware.ClubAuthorizeById, clubController.UpdateClub) + clubID.Patch( + "/", + middleware.AttachExtractor(clubParams.AuthMiddleware.ClubAuthorizeById, middleware.ExtractFromParams("clubID")), + clubController.UpdateClub, + ) clubID.Delete("/", clubParams.AuthMiddleware.Authorize(p.DeleteAll), clubController.DeleteClub) return clubID diff --git a/backend/entities/clubs/base/service.go b/backend/entities/clubs/base/service.go index 85c0a02c3..413ae33ce 100644 --- a/backend/entities/clubs/base/service.go +++ b/backend/entities/clubs/base/service.go @@ -35,7 +35,7 @@ func (c *ClubService) CreateClub(clubBody models.CreateClubRequestBody) (*models return nil, err } - club, err := utilities.MapRequestToModel(clubBody, &models.Club{}) + club, err := utilities.MapJsonTags(clubBody, &models.Club{}) if err != nil { return nil, err } @@ -66,7 +66,7 @@ func (c *ClubService) UpdateClub(id string, clubBody models.UpdateClubRequestBod return nil, err } - club, err := utilities.MapRequestToModel(clubBody, &models.Club{}) + club, err := utilities.MapJsonTags(clubBody, &models.Club{}) if err != nil { return nil, err } diff --git a/backend/entities/clubs/contact/routes.go b/backend/entities/clubs/contact/routes.go index 883f2b63d..c2dbeafbe 100644 --- a/backend/entities/clubs/contact/routes.go +++ b/backend/entities/clubs/contact/routes.go @@ -1,6 +1,7 @@ package contact import ( + "github.com/GenerateNU/sac/backend/middleware" "github.com/GenerateNU/sac/backend/types" ) @@ -11,5 +12,9 @@ func ClubContact(clubParams types.RouteParams) { // api/v1/clubs/:clubID/contacts/* clubContacts.Get("/", clubContactController.GetClubContacts) - clubContacts.Put("/", clubParams.AuthMiddleware.ClubAuthorizeById, clubContactController.PutContact) + clubContacts.Put( + "/", + middleware.AttachExtractor(clubParams.AuthMiddleware.ClubAuthorizeById, middleware.ExtractFromParams("clubID")), + clubContactController.PutContact, + ) } diff --git a/backend/entities/clubs/contact/service.go b/backend/entities/clubs/contact/service.go index 5f35e2357..43b0bf5bf 100644 --- a/backend/entities/clubs/contact/service.go +++ b/backend/entities/clubs/contact/service.go @@ -38,7 +38,7 @@ func (c *ClubContactService) PutClubContact(clubID string, contactBody models.Pu return nil, err } - contact, err := utilities.MapRequestToModel(contactBody, &models.Contact{}) + contact, err := utilities.MapJsonTags(contactBody, &models.Contact{}) if err != nil { return nil, err } diff --git a/backend/entities/clubs/member/routes.go b/backend/entities/clubs/member/routes.go index 220b271b9..a5e184717 100644 --- a/backend/entities/clubs/member/routes.go +++ b/backend/entities/clubs/member/routes.go @@ -1,6 +1,7 @@ package member import ( + "github.com/GenerateNU/sac/backend/middleware" "github.com/GenerateNU/sac/backend/types" "github.com/garrettladley/fiberpaginate" ) @@ -12,6 +13,14 @@ func ClubMember(clubParams types.RouteParams) { // api/v1/clubs/:clubID/members/* clubMembers.Get("/", fiberpaginate.New(), clubMemberController.GetClubMembers) - clubMembers.Post("/:userID", clubParams.AuthMiddleware.ClubAuthorizeById, clubMemberController.CreateClubMember) - clubMembers.Delete("/:userID", clubParams.AuthMiddleware.ClubAuthorizeById, clubMemberController.DeleteClubMember) + clubMembers.Post( + "/:userID", + middleware.AttachExtractor(clubParams.AuthMiddleware.ClubAuthorizeById, middleware.ExtractFromParams("clubID")), + clubMemberController.CreateClubMember, + ) + clubMembers.Delete( + "/:userID", + middleware.AttachExtractor(clubParams.AuthMiddleware.ClubAuthorizeById, middleware.ExtractFromParams("clubID")), + clubMemberController.DeleteClubMember, + ) } diff --git a/backend/entities/clubs/poc/routes.go b/backend/entities/clubs/poc/routes.go index 135f72a8e..759162f4e 100644 --- a/backend/entities/clubs/poc/routes.go +++ b/backend/entities/clubs/poc/routes.go @@ -1,6 +1,7 @@ package poc import ( + "github.com/GenerateNU/sac/backend/middleware" "github.com/GenerateNU/sac/backend/types" ) @@ -12,8 +13,24 @@ func ClubPointOfContact(clubParams types.RouteParams) { // api/v1/clubs/:clubID/pocs/* clubPointOfContacts.Get("/", clubPointOfContactController.GetClubPointOfContacts) clubPointOfContacts.Get("/:pocID", clubPointOfContactController.GetClubPointOfContact) - clubPointOfContacts.Post("/", clubParams.AuthMiddleware.ClubAuthorizeById, clubPointOfContactController.CreateClubPointOfContact) - clubPointOfContacts.Patch("/:pocID", clubParams.AuthMiddleware.ClubAuthorizeById, clubPointOfContactController.UpdateClubPointOfContact) - clubPointOfContacts.Patch("/:pocID/photo", clubParams.AuthMiddleware.ClubAuthorizeById, clubPointOfContactController.UpdateClubPointOfContactPhoto) - clubPointOfContacts.Delete("/:pocID", clubParams.AuthMiddleware.ClubAuthorizeById, clubPointOfContactController.DeleteClubPointOfContact) + clubPointOfContacts.Post( + "/", + middleware.AttachExtractor(clubParams.AuthMiddleware.ClubAuthorizeById, middleware.ExtractFromParams("clubID")), + clubPointOfContactController.CreateClubPointOfContact, + ) + clubPointOfContacts.Patch( + "/:pocID", + middleware.AttachExtractor(clubParams.AuthMiddleware.ClubAuthorizeById, middleware.ExtractFromParams("clubID")), + clubPointOfContactController.UpdateClubPointOfContact, + ) + clubPointOfContacts.Patch( + "/:pocID/photo", + middleware.AttachExtractor(clubParams.AuthMiddleware.ClubAuthorizeById, middleware.ExtractFromParams("clubID")), + clubPointOfContactController.UpdateClubPointOfContactPhoto, + ) + clubPointOfContacts.Delete( + "/:pocID", + middleware.AttachExtractor(clubParams.AuthMiddleware.ClubAuthorizeById, middleware.ExtractFromParams("clubID")), + clubPointOfContactController.DeleteClubPointOfContact, + ) } diff --git a/backend/entities/clubs/tag/routes.go b/backend/entities/clubs/tag/routes.go index 938b59109..2124ca0c6 100644 --- a/backend/entities/clubs/tag/routes.go +++ b/backend/entities/clubs/tag/routes.go @@ -1,6 +1,7 @@ package tag import ( + "github.com/GenerateNU/sac/backend/middleware" "github.com/GenerateNU/sac/backend/types" ) @@ -11,6 +12,14 @@ func ClubTag(clubParams types.RouteParams) { // api/v1/clubs/:clubID/tags/* clubTags.Get("/", clubTagController.GetClubTags) - clubTags.Post("/", clubParams.AuthMiddleware.ClubAuthorizeById, clubTagController.CreateClubTags) - clubTags.Delete("/:tagID", clubParams.AuthMiddleware.ClubAuthorizeById, clubTagController.DeleteClubTag) + clubTags.Post( + "/", + middleware.AttachExtractor(clubParams.AuthMiddleware.ClubAuthorizeById, middleware.ExtractFromParams("clubID")), + clubTagController.CreateClubTags, + ) + clubTags.Delete( + "/:tagID", + middleware.AttachExtractor(clubParams.AuthMiddleware.ClubAuthorizeById, middleware.ExtractFromParams("clubID")), + clubTagController.DeleteClubTag, + ) } diff --git a/backend/entities/clubs/tag/transactions.go b/backend/entities/clubs/tag/transactions.go index 7eb03e47f..d5c5aa586 100644 --- a/backend/entities/clubs/tag/transactions.go +++ b/backend/entities/clubs/tag/transactions.go @@ -11,12 +11,12 @@ import ( ) func CreateClubTags(db *gorm.DB, id uuid.UUID, tags []models.Tag) ([]models.Tag, error) { - user, err := clubs.GetClub(db, id, transactions.PreloadTag()) + club, err := clubs.GetClub(db, id, transactions.PreloadTag()) if err != nil { return nil, err } - if err := db.Model(&user).Association("Tag").Append(tags); err != nil { + if err := db.Model(&club).Association("Tag").Append(tags); err != nil { return nil, err } @@ -26,7 +26,7 @@ func CreateClubTags(db *gorm.DB, id uuid.UUID, tags []models.Tag) ([]models.Tag, func GetClubTags(db *gorm.DB, id uuid.UUID) ([]models.Tag, error) { var tags []models.Tag - club, err := clubs.GetClub(db, id) + club, err := clubs.GetClub(db, id, transactions.PreloadTag()) if err != nil { return nil, err } @@ -38,7 +38,7 @@ func GetClubTags(db *gorm.DB, id uuid.UUID) ([]models.Tag, error) { } func DeleteClubTag(db *gorm.DB, id uuid.UUID, tagID uuid.UUID) error { - club, err := clubs.GetClub(db, id) + club, err := clubs.GetClub(db, id, transactions.PreloadTag()) if err != nil { return err } diff --git a/backend/entities/events/base/controller.go b/backend/entities/events/base/controller.go index 8957d394f..6fcdf2ace 100644 --- a/backend/entities/events/base/controller.go +++ b/backend/entities/events/base/controller.go @@ -67,73 +67,13 @@ func (e *EventController) GetEvent(c *fiber.Ctx) error { return c.Status(http.StatusOK).JSON(event) } -// GetSeriesByEventID godoc -// -// @Summary Retrieve all series by event -// @Description Retrieves all series associated with an event -// @ID get-series-by-event -// @Tags event -// @Produce json -// @Param eventID path string true "Event ID" -// @Success 200 {object} []models.Series -// @Failure 400 {object} error -// @Failure 404 {object} error -// @Failure 500 {object} error -// @Router /events/{eventID}/series/ [get] -func (e *EventController) GetSeriesByEventID(c *fiber.Ctx) error { - events, err := e.eventService.GetSeriesByEventID(c.Params("eventID")) - if err != nil { - return err - } - - return c.Status(http.StatusOK).JSON(events) -} - -// GetSeriesByID godoc -// -// @Summary Retrieve a series by ID -// @Description Retrieves a series by ID -// @ID get-series-by-id -// @Tags event -// @Produce json -// @Param eventID path string true "Event ID" -// @Param seriesID path string true "Series ID" -// @Success 200 {object} models.Series -// @Failure 400 {object} error -// @Failure 404 {object} error -// @Failure 500 {object} error -// @Router /events/{eventID}/series/{seriesID}/ [get] -func (e *EventController) GetSeriesByID(c *fiber.Ctx) error { - events, err := e.eventService.GetSeriesByID(c.Params("seriesID")) - if err != nil { - return err - } - - return c.Status(http.StatusOK).JSON(events) -} - -// CreateEvent godoc -// -// @Summary Create an event -// @Description Creates an event -// @ID create-event -// @Tags event -// @Accept json -// @Produce json -// @Param event body models.CreateEventRequestBody true "Event Body" -// @Success 201 {object} models.Event -// @Failure 400 {object} error -// @Failure 401 {object} error -// @Failure 404 {object} error -// @Failure 500 {object} error -// @Router /events/ [post] func (e *EventController) CreateEvent(c *fiber.Ctx) error { - var eventBody models.CreateEventRequestBody - if err := c.BodyParser(&eventBody); err != nil { - return utilities.InvalidJSON() + var body models.CreateEventRequestBody + if err := c.BodyParser(&body); err != nil { + return err } - event, err := e.eventService.CreateEvent(eventBody) + event, err := e.eventService.CreateEvent(body) if err != nil { return err } @@ -141,206 +81,25 @@ func (e *EventController) CreateEvent(c *fiber.Ctx) error { return c.Status(http.StatusCreated).JSON(event) } -// UpdateEvent godoc -// -// @Summary Create a series -// @Description Creates a series -// @ID create-series -// @Tags event -// @Accept json -// @Produce json -// @Param eventID path string true "Event ID" -// @Param seriesBody body models.UpdateEventRequestBody true "Series Body" -// @Success 201 {object} models.Series -// @Failure 400 {object} error -// @Failure 401 {object} error -// @Failure 404 {object} error -// @Failure 500 {object} error -// @Router /events/{eventID}/series/ [patch] func (e *EventController) UpdateEvent(c *fiber.Ctx) error { - var eventBody models.UpdateEventRequestBody - if err := c.BodyParser(&eventBody); err != nil { - return utilities.InvalidJSON() - } - - updatedEvent, err := e.eventService.UpdateEvent(c.Params("eventID"), eventBody) - if err != nil { + var body models.UpdateEventRequestBody + if err := c.BodyParser(&body); err != nil { return err } - return c.Status(http.StatusOK).JSON(updatedEvent) -} - -// UpdateSeriesByID godoc -// -// @Summary Update a series by ID -// @Description Updates a series by ID. If individual events have been edited prior, -// -// this update will override the previous changes -// -// @ID update-series-by-id -// @Tags event -// @Accept json -// @Produce json -// @Param seriesID path string true "Series ID" -// @Param seriesBody body models.UpdateSeriesRequestBody true "Series Body" -// @Success 200 {object} models.Series -// @Failure 400 {object} error -// @Failure 401 {object} error -// @Failure 404 {object} error -// @Failure 500 {object} error -// @Router /events/{eventID}/series/{seriesID}/ [patch] -func (e *EventController) UpdateSeriesByID(c *fiber.Ctx) error { - var seriesBody models.UpdateSeriesRequestBody - if err := c.BodyParser(&seriesBody); err != nil { - return utilities.InvalidJSON() - } - - updatedSeries, err := e.eventService.UpdateSeries(c.Params("seriesID"), seriesBody) - if err != nil { - return err - } - - return c.Status(http.StatusOK).JSON(updatedSeries) -} - -// UpdateSeriesByEventID godoc -// -// @Summary Update a series by event ID -// @Description Updates a series by event ID -// @ID update-series-by-event-id -// @Tags event -// @Accept json -// @Produce json -// @Param eventID path string true "Event ID" -// @Param seriesBody body models.UpdateSeriesRequestBody true "Series Body" -// @Success 200 {object} models.Series -// @Failure 400 {object} error -// @Failure 401 {object} error -// @Failure 404 {object} error -// @Failure 500 {object} error -// @Router /events/{eventID}/series/{seriesID}/ [patch] -func (e *EventController) UpdateSeriesByEventID(c *fiber.Ctx) error { - var seriesBody models.UpdateSeriesRequestBody - if err := c.BodyParser(&seriesBody); err != nil { - return utilities.InvalidJSON() - } - - updatedSeries, err := e.eventService.UpdateSeriesByEventID(c.Params("eventID"), seriesBody) + event, err := e.eventService.UpdateEvent(c.Params("eventID"), body) if err != nil { return err } - return c.Status(http.StatusOK).JSON(updatedSeries) -} - -// DeleteSeriesByID godoc -// -// @Summary Delete a series by ID -// @Description Deletes a series by ID -// @ID delete-series-by-id -// @Tags event -// @Produce json -// @Param eventID path string true "Event ID" -// @Param seriesID path string true "Series ID" -// @Success 204 {string} utilities.SuccessResponse -// @Failure 400 {object} error -// @Failure 401 {object} error -// @Failure 404 {object} error -// @Failure 500 {object} error -// @Router /events/{eventID}/series/{seriesID}/ [delete] -func (e *EventController) DeleteSeriesByID(c *fiber.Ctx) error { - if err := e.eventService.DeleteSeriesByID(c.Params("seriesID")); err != nil { - return err - } - - return c.SendStatus(http.StatusNoContent) -} - -// DeleteSeriesByEventID godoc -// -// @Summary Delete all series by event -// @Description Deletes all series associated with an event -// @ID delete-series-by-event -// @Tags event -// @Produce json -// @Param eventID path string true "Event ID" -// @Success 204 {string} utilities.SuccessResponse -// @Failure 400 {object} error -// @Failure 401 {object} error -// @Failure 404 {object} error -// @Failure 500 {object} error -// @Router /events/{eventID}/series/ [delete] -func (e *EventController) DeleteSeriesByEventID(c *fiber.Ctx) error { - if err := e.eventService.DeleteSeriesByEventID(c.Params("eventID")); err != nil { - return err - } - - return c.SendStatus(http.StatusNoContent) + return c.Status(http.StatusOK).JSON(event) } -// DeleteEvent godoc -// -// @Summary Delete an event -// @Description Deletes an event -// @ID delete-event -// @Tags event -// @Produce json -// @Param eventID path string true "Event ID" -// @Success 204 {string} utilities.SuccessResponse -// @Failure 400 {object} error -// @Failure 401 {object} error -// @Failure 404 {object} error -// @Failure 500 {object} error -// @Router /events/{eventID}/ [delete] func (e *EventController) DeleteEvent(c *fiber.Ctx) error { - if err := e.eventService.DeleteEvent(c.Params("eventID")); err != nil { - return err - } - - return c.SendStatus(http.StatusNoContent) -} - -// GetHostsByEventID godoc -// -// @Summary Retrieve all hosts by event -// @Description Retrieves all hosts associated with an event -// @ID get-hosts-by-event -// @Tags event -// @Produce json -// @Param eventID path string true "Event ID" -// @Success 200 {object} []models.Club -// @Failure 400 {object} error -// @Failure 404 {object} error -// @Failure 500 {object} error -// @Router /events/{eventID}/hosts [get] -func (e *EventController) GetHostsByEventID(c *fiber.Ctx) error { - hosts, err := e.eventService.GetHostsByEventID(c.Params("eventID")) + err := e.eventService.DeleteEvent(c.Params("eventID")) if err != nil { return err } - return c.Status(http.StatusOK).JSON(hosts) -} - -// GetTagsByEventID godoc -// -// @Summary Retrieve all tags by event -// @Description Retrieves all tags associated with an event -// @ID get-tags-by-event -// @Tags event -// @Produce json -// @Param eventID path string true "Event ID" -// @Success 200 {object} []models.Tag -// @Failure 400 {object} error -// @Failure 404 {object} error -// @Failure 500 {object} error -// @Router /events/{eventID}/tags [get] -func (e *EventController) GetTagsByEventID(c *fiber.Ctx) error { - tags, err := e.eventService.GetTagsByEventID(c.Params("eventID")) - if err != nil { - return err - } - - return c.Status(http.StatusOK).JSON(tags) + return c.SendStatus(http.StatusNoContent) } diff --git a/backend/entities/events/base/routes.go b/backend/entities/events/base/routes.go index 96f6a44d3..fa554a762 100644 --- a/backend/entities/events/base/routes.go +++ b/backend/entities/events/base/routes.go @@ -1,39 +1,41 @@ package base import ( + "github.com/GenerateNU/sac/backend/entities/events/series" + "github.com/GenerateNU/sac/backend/entities/events/tags" + "github.com/gofiber/fiber/v2" + + "github.com/GenerateNU/sac/backend/middleware" "github.com/GenerateNU/sac/backend/types" "github.com/garrettladley/fiberpaginate" ) -func Event(eventParams types.RouteParams) { +func EventRoutes(eventParams types.RouteParams) { + eventParams.Router = EventRouter(eventParams) + + series.EventSeries(eventParams) + tags.EventTags(eventParams) +} + +func EventRouter(eventParams types.RouteParams) fiber.Router { eventController := NewEventController(NewEventService(eventParams.ServiceParams)) // api/v1/events/* events := eventParams.Router.Group("/events") events.Get("/", fiberpaginate.New(), eventController.GetAllEvents) - events.Post("/", eventParams.AuthMiddleware.ClubAuthorizeById, eventController.CreateEvent) + events.Post( + "/", + middleware.AttachExtractor(eventParams.AuthMiddleware.ClubAuthorizeById, middleware.ExtractFromParams("clubID")), + eventController.CreateEvent, + ) // api/v1/events/:eventID/* eventID := events.Group("/:eventID") eventID.Get("/", eventController.GetEvent) - eventID.Get("/series", eventController.GetSeriesByEventID) eventID.Patch("/", eventController.UpdateEvent) - eventID.Patch("/series", eventController.UpdateSeriesByEventID) eventID.Delete("/", eventController.DeleteEvent) - eventID.Delete("/series", eventController.DeleteSeriesByEventID) - - eventID.Get("/hosts", eventController.GetHostsByEventID) - eventID.Get("/tags", eventController.GetTagsByEventID) - - // api/v1/events/series/* - series := events.Group("/series") - - // api/v1/events/series/:seriesID/* - seriesID := series.Group("/:seriesID") - seriesID.Get("/", eventController.GetSeriesByID) - seriesID.Patch("/", eventParams.AuthMiddleware.ClubAuthorizeById, eventController.UpdateSeriesByID) - seriesID.Delete("/", eventParams.AuthMiddleware.ClubAuthorizeById, eventController.DeleteSeriesByID) + return events } diff --git a/backend/entities/events/base/service.go b/backend/entities/events/base/service.go index 9b2e8af1c..53521a068 100644 --- a/backend/entities/events/base/service.go +++ b/backend/entities/events/base/service.go @@ -1,26 +1,22 @@ package base import ( + "github.com/GenerateNU/sac/backend/entities/events" "github.com/GenerateNU/sac/backend/entities/models" + "github.com/GenerateNU/sac/backend/types" "github.com/GenerateNU/sac/backend/utilities" "github.com/garrettladley/fiberpaginate" ) type EventServiceInterface interface { + // getters GetEvents(pageInfo fiberpaginate.PageInfo) ([]models.Event, error) - GetEvent(eventID string) ([]models.Event, error) - GetSeriesByEventID(eventID string) ([]models.Event, error) - GetSeriesByID(seriesID string) ([]models.Event, error) - CreateEvent(eventBodies models.CreateEventRequestBody) ([]models.Event, error) + GetEvent(eventID string) (*models.Event, error) + // event cud + CreateEvent(body models.CreateEventRequestBody) (*models.Event, error) UpdateEvent(eventID string, eventBody models.UpdateEventRequestBody) ([]models.Event, error) - UpdateSeries(seriesID string, seriesBody models.UpdateSeriesRequestBody) ([]models.Event, error) - UpdateSeriesByEventID(eventID string, seriesBody models.UpdateSeriesRequestBody) ([]models.Event, error) DeleteEvent(eventID string) error - DeleteSeriesByEventID(seriesID string) error - DeleteSeriesByID(seriesID string) error - GetHostsByEventID(eventID string) ([]models.Club, error) - GetTagsByEventID(eventID string) ([]models.Tag, error) } type EventService struct { @@ -35,138 +31,39 @@ func (e *EventService) GetEvents(pageInfo fiberpaginate.PageInfo) ([]models.Even return GetEvents(e.DB, pageInfo) } -// right now we are always returning a slice -func (e *EventService) CreateEvent(eventBody models.CreateEventRequestBody) ([]models.Event, error) { - if err := utilities.Validate(e.Validate, eventBody); err != nil { - return nil, err - } - - event := &models.Event{ - Name: eventBody.Name, - Preview: eventBody.Preview, - Content: eventBody.Content, - StartTime: eventBody.StartTime, - EndTime: eventBody.EndTime, - Location: eventBody.Location, - EventType: eventBody.EventType, - IsRecurring: *eventBody.IsRecurring, - - Host: eventBody.Host, - Clubs: eventBody.Clubs, - Tag: eventBody.Tag, - Notification: eventBody.Notification, - } - - if !event.IsRecurring { - return CreateEvent(e.DB, *event) - } - - if err := utilities.Validate(e.Validate, eventBody.Series); err != nil { - return nil, err - } - - series, err := utilities.MapRequestToModel(eventBody.Series, &models.Series{}) - if err != nil { - return nil, err - } - - // Create other events in series and update field in series (for join table) - events := createEventSlice(event, *series) - series.Events = events - - return CreateEventSeries(e.DB, *series) -} - -func (e *EventService) GetEvent(eventID string) ([]models.Event, error) { +func (e *EventService) GetEvent(eventID string) (*models.Event, error) { idAsUUID, err := utilities.ValidateID(eventID) if err != nil { return nil, err } - return GetEvent(e.DB, *idAsUUID) + return events.GetEvent(e.DB, *idAsUUID) } -func (e *EventService) GetSeriesByEventID(eventID string) ([]models.Event, error) { - idAsUUID, err := utilities.ValidateID(eventID) - if err != nil { +func (e *EventService) CreateEvent(body models.CreateEventRequestBody) (*models.Event, error) { + if err := utilities.Validate(e.Validate, body); err != nil { return nil, err } - return GetSeriesByEventID(e.DB, *idAsUUID) + return CreateEvent(e.DB, *body.Into()) } -func (e *EventService) GetSeriesByID(seriesID string) ([]models.Event, error) { - idAsUUID, err := utilities.ValidateID(seriesID) - if err != nil { - return nil, err - } - - return GetSeriesByID(e.DB, *idAsUUID) -} - -func (e *EventService) UpdateEvent(id string, eventBody models.UpdateEventRequestBody) ([]models.Event, error) { - idAsUUID, err := utilities.ValidateID(id) +func (e *EventService) UpdateEvent(eventID string, eventBody models.UpdateEventRequestBody) ([]models.Event, error) { + idAsUUID, err := utilities.ValidateID(eventID) if err != nil { return nil, err } - if utilities.AtLeastOne(eventBody, models.UpdateEventRequestBody{}) { - return nil, err - } - if err := utilities.Validate(e.Validate, eventBody); err != nil { return nil, err } - updatedEvent := mapToEvent(eventBody) - - return UpdateEvent(e.DB, *idAsUUID, *updatedEvent) -} - -func (e *EventService) UpdateSeries(seriesID string, seriesBody models.UpdateSeriesRequestBody) ([]models.Event, error) { - seriesIDAsUUID, err := utilities.ValidateID(seriesID) - if err != nil { - return nil, err - } - - if err := utilities.Validate(e.Validate, seriesBody); err != nil { - return nil, err - } - - series, err := utilities.MapRequestToModel(seriesBody, &models.Series{}) + event, err := utilities.MapJsonTags(eventBody, &models.Event{}) if err != nil { return nil, err } - updatedEventBody := mapToEvent(seriesBody.EventDetails) - - newEvents := createEventSlice(updatedEventBody, *series) - series.Events = newEvents - - return UpdateSeries(e.DB, *seriesIDAsUUID, *series) -} - -func (e *EventService) UpdateSeriesByEventID(eventID string, seriesBody models.UpdateSeriesRequestBody) ([]models.Event, error) { - eventIDAsUUID, err := utilities.ValidateID(eventID) - if err != nil { - return nil, err - } - - if err := utilities.Validate(e.Validate, seriesBody); err != nil { - return nil, err - } - - series, err := utilities.MapRequestToModel(seriesBody, &models.Series{}) - if err != nil { - return nil, err - } - - updatedEventBody := mapToEvent(seriesBody.EventDetails) - - newEvents := createEventSlice(updatedEventBody, *series) - series.Events = newEvents - - return UpdateSeriesByEventID(e.DB, *eventIDAsUUID, *series) + return UpdateEvent(e.DB, *idAsUUID, *event, *eventBody.UpdateAllInSeries) } func (e *EventService) DeleteEvent(eventID string) error { @@ -177,81 +74,3 @@ func (e *EventService) DeleteEvent(eventID string) error { return DeleteEvent(e.DB, *idAsUUID) } - -func (e *EventService) DeleteSeriesByEventID(eventID string) error { - idAsUUID, err := utilities.ValidateID(eventID) - if err != nil { - return err - } - - return DeleteSeriesByEventID(e.DB, *idAsUUID) -} - -func (e *EventService) DeleteSeriesByID(seriesID string) error { - idAsUUID, err := utilities.ValidateID(seriesID) - if err != nil { - return err - } - - return DeleteSeriesByID(e.DB, *idAsUUID) -} - -func (e *EventService) GetHostsByEventID(eventID string) ([]models.Club, error) { - idAsUUID, err := utilities.ValidateID(eventID) - if err != nil { - return nil, err - } - - return GetHostsByEventID(e.DB, *idAsUUID) -} - -func (e *EventService) GetTagsByEventID(eventID string) ([]models.Tag, error) { - idAsUUID, err := utilities.ValidateID(eventID) - if err != nil { - return nil, err - } - - return GetTagsByEventID(e.DB, *idAsUUID) -} - -func createEventSlice(firstEvent *models.Event, series models.Series) []models.Event { - eventBodies := []models.Event{*firstEvent} - months, days := 0, 0 - - switch series.RecurringType { - case "daily": - days = 1 - case "weekly": - days = 7 - case "monthly": - months = 1 - } - - for i := 1; i < series.MaxOccurrences; i++ { - eventToAdd := *firstEvent - eventToAdd.StartTime = eventToAdd.StartTime.AddDate(0, i*months, i*days) - eventToAdd.EndTime = eventToAdd.EndTime.AddDate(0, i*months, i*days) - eventBodies = append(eventBodies, eventToAdd) - } - - return eventBodies -} - -func mapToEvent(eventBody models.UpdateEventRequestBody) *models.Event { - return &models.Event{ - Name: eventBody.Name, - Preview: eventBody.Preview, - Content: eventBody.Content, - StartTime: eventBody.StartTime, - EndTime: eventBody.EndTime, - Location: eventBody.Location, - EventType: eventBody.EventType, - - Host: eventBody.Host, - RSVP: eventBody.RSVP, - Waitlist: eventBody.Waitlist, - Clubs: eventBody.Clubs, - Tag: eventBody.Tag, - Notification: eventBody.Notification, - } -} diff --git a/backend/entities/events/base/transactions.go b/backend/entities/events/base/transactions.go index 1d50036d1..566d0c262 100644 --- a/backend/entities/events/base/transactions.go +++ b/backend/entities/events/base/transactions.go @@ -2,16 +2,17 @@ package base import ( "errors" + "log/slog" - "github.com/GenerateNU/sac/backend/entities/clubs" + "github.com/GenerateNU/sac/backend/entities/events" "github.com/GenerateNU/sac/backend/entities/models" "github.com/garrettladley/fiberpaginate" - "github.com/GenerateNU/sac/backend/transactions" "github.com/GenerateNU/sac/backend/utilities" "github.com/google/uuid" "gorm.io/gorm" + "gorm.io/gorm/clause" ) func GetEvents(db *gorm.DB, pageInfo fiberpaginate.PageInfo) ([]models.Event, error) { @@ -23,146 +24,54 @@ func GetEvents(db *gorm.DB, pageInfo fiberpaginate.PageInfo) ([]models.Event, er return events, nil } -func GetEvent(db *gorm.DB, eventID uuid.UUID, preloads ...transactions.OptionalQuery) ([]models.Event, error) { - var event models.Event - - query := db - - for _, preload := range preloads { - query = preload(query) - } - - if err := query.First(&event, eventID).Error; err != nil { - if errors.Is(err, gorm.ErrRecordNotFound) { - return nil, utilities.ErrNotFound - } +func CreateEvent(db *gorm.DB, event models.Event) (*models.Event, error) { + if err := db.Create(&event).Error; err != nil { return nil, err } - return []models.Event{event}, nil + return &event, nil } -func GetSeriesID(db *gorm.DB, eventID uuid.UUID) (*uuid.UUID, error) { - var event models.Event - - if err := db.First(&event, eventID).Error; err != nil { - if errors.Is(err, gorm.ErrRecordNotFound) { - return nil, utilities.ErrNotFound - } - return nil, err +func UpdateEvent(db *gorm.DB, id uuid.UUID, event models.Event, updateAllInSeries bool) ([]models.Event, error) { + if updateAllInSeries { + return updateEventSeries(db, id, event) + } else { + return updateEvent(db, id, event) } - - var seriesID string - - if err := db.Model(&models.EventSeries{}).Where("event_id = ?", event.ID).Select("series_id").Find(&seriesID).Error; err != nil { - return nil, err - } - - parsedSeriesID, err := uuid.Parse(seriesID) - if err != nil { - return nil, err - } - - return &parsedSeriesID, nil -} - -func GetSeriesByEventID(db *gorm.DB, id uuid.UUID) ([]models.Event, error) { - seriesID, err := GetSeriesID(db, id) - if err != nil { - return nil, err - } - events, err := GetSeriesByID(db, *seriesID) - if err != nil { - return nil, err - } - return events, nil } -func GetSeriesByID(db *gorm.DB, id uuid.UUID) ([]models.Event, error) { - var series models.Series - - if err := db.Preload("Events").Find(&series, id).Error; err != nil { - return nil, err - } - - return series.Events, nil -} - -func CreateEvent(db *gorm.DB, event models.Event) ([]models.Event, error) { - tx := db.Begin() - - if err := tx.Create(&event).Error; err != nil { - tx.Rollback() - return nil, err - } - - if err := tx.Commit().Error; err != nil { - tx.Rollback() - return nil, err - } - - return []models.Event{event}, nil -} - -func CreateEventSeries(db *gorm.DB, series models.Series) ([]models.Event, error) { - if err := db.Create(&series).Error; err != nil { - return nil, err - } - - return series.Events, nil -} - -func UpdateEvent(db *gorm.DB, id uuid.UUID, event models.Event) ([]models.Event, error) { - if err := db.Model(&models.Event{}).Where("id = ?", id).Updates(event).Error; err != nil { - if errors.Is(err, gorm.ErrRecordNotFound) { - return nil, utilities.ErrNotFound - } - return nil, err - } - - var existingEvent models.Event - - if err := db.First(&existingEvent, id).Error; err != nil { - if errors.Is(err, gorm.ErrRecordNotFound) { +func updateEvent(db *gorm.DB, id uuid.UUID, event models.Event) ([]models.Event, error) { + var resultingEvent models.Event + if result := db.Model(&resultingEvent).Clauses(clause.Returning{}).Where("id = ?", id).Updates(&event); result.RowsAffected == 0 { + if result.Error == nil { return nil, utilities.ErrNotFound } - return nil, err + return nil, result.Error } - if err := db.Model(&existingEvent).Updates(&event).Error; err != nil { - return nil, err - } - - return []models.Event{existingEvent}, nil + return []models.Event{resultingEvent}, nil } -func UpdateSeries(db *gorm.DB, seriesID uuid.UUID, series models.Series) ([]models.Event, error) { - err := DeleteSeriesByID(db, seriesID) - if err != nil { - return nil, err - } - - series.ID = seriesID - - events, err := CreateEventSeries(db, series) +func updateEventSeries(db *gorm.DB, id uuid.UUID, event models.Event) ([]models.Event, error) { + targetEvent, err := events.GetEvent(db, id) if err != nil { return nil, err } - return events, nil -} -func UpdateSeriesByEventID(db *gorm.DB, eventID uuid.UUID, series models.Series) ([]models.Event, error) { - seriesID, err := GetSeriesID(db, eventID) - if err != nil { - return nil, err + if targetEvent.SeriesID == nil { + slog.Error("event is not part of a series", "eventID", id) + return nil, utilities.BadRequest(errors.New("event is not part of a series")) } - events, err := UpdateSeries(db, *seriesID, series) - if err != nil { - return nil, err + var resultingEvents []models.Event + if result := db.Model(&resultingEvents).Clauses(clause.Returning{}).Where("series_id = ?", targetEvent.SeriesID).Updates(&event); result.RowsAffected == 0 { + if result.Error == nil { + return nil, utilities.ErrNotFound + } + return nil, result.Error } - return events, nil + return resultingEvents, nil } func DeleteEvent(db *gorm.DB, id uuid.UUID) error { @@ -175,71 +84,3 @@ func DeleteEvent(db *gorm.DB, id uuid.UUID) error { return nil } - -func DeleteSeriesByEventID(db *gorm.DB, eventID uuid.UUID) error { - seriesID, err := GetSeriesID(db, eventID) - if err != nil { - return err - } - - if err := DeleteSeriesByID(db, *seriesID); err != nil { - return err - } - - return nil -} - -func DeleteSeriesByID(db *gorm.DB, seriesID uuid.UUID) error { - tx := db.Begin() - - var eventIDs uuid.UUIDs - - if err := tx.Model(&models.EventSeries{}).Select("event_id").Where("series_id = (?)", seriesID).Find(&eventIDs).Error; err != nil { - tx.Rollback() - return err - } else if len(eventIDs) < 1 { - tx.Rollback() - return utilities.ErrNotFound - } - - if result := tx.Delete(&models.Event{}, eventIDs); result.RowsAffected == 0 { - tx.Rollback() - return result.Error - } - - if result := tx.Delete(&models.Series{}, seriesID); result.RowsAffected == 0 { - tx.Rollback() - return result.Error - } - - if err := tx.Commit().Error; err != nil { - tx.Rollback() - return err - } - - return nil -} - -func GetHostsByEventID(db *gorm.DB, eventID uuid.UUID) ([]models.Club, error) { - // Get the club that hosts the event - event, err := GetEvent(db, eventID) - if err != nil { - return nil, err - } - - clubs, err := clubs.GetClub(db, *event[0].Host, transactions.PreloadEvent()) - if err != nil { - return nil, err - } - - return []models.Club{*clubs}, nil -} - -func GetTagsByEventID(db *gorm.DB, eventID uuid.UUID) ([]models.Tag, error) { - event, err := GetEvent(db, eventID, transactions.PreloadTag()) - if err != nil { - return nil, err - } - - return event[0].Tag, nil -} diff --git a/backend/entities/events/series/controller.go b/backend/entities/events/series/controller.go new file mode 100644 index 000000000..470a6b4c0 --- /dev/null +++ b/backend/entities/events/series/controller.go @@ -0,0 +1,47 @@ +package series + +import ( + "net/http" + + "github.com/GenerateNU/sac/backend/utilities" + "github.com/gofiber/fiber/v2" +) + +type EventSeriesController struct { + eventSeriesService EventSeriesServiceInterface +} + +func NewEventSeriesController(eventSeriesService EventSeriesServiceInterface) *EventSeriesController { + return &EventSeriesController{eventSeriesService: eventSeriesService} +} + +func (e *EventSeriesController) CreateEventSeries(c *fiber.Ctx) error { + var body CreateEventSeriesRequestBody + if err := c.BodyParser(&body); err != nil { + return utilities.InvalidJSON() + } + + events, err := e.eventSeriesService.CreateEventSeries(body) + if err != nil { + return err + } + + return c.Status(http.StatusCreated).JSON(events) +} + +func (e *EventSeriesController) GetEventSeries(c *fiber.Ctx) error { + events, err := e.eventSeriesService.GetEventSeries(c.Params("seriesID")) + if err != nil { + return err + } + + return c.Status(http.StatusOK).JSON(events) +} + +func (e *EventSeriesController) DeleteEventSeries(c *fiber.Ctx) error { + if err := e.eventSeriesService.DeleteEventSeries(c.Params("seriesID")); err != nil { + return err + } + + return c.SendStatus(http.StatusNoContent) +} diff --git a/backend/entities/events/series/models.go b/backend/entities/events/series/models.go new file mode 100644 index 000000000..71af27eb7 --- /dev/null +++ b/backend/entities/events/series/models.go @@ -0,0 +1,49 @@ +package series + +import ( + "fmt" + "time" + + "github.com/GenerateNU/sac/backend/entities/models" + "github.com/GenerateNU/sac/backend/protos" + "github.com/GenerateNU/sac/backend/utilities" +) + +type CreateEventSeriesRequestBody struct { + models.CreateEventRequestBody + Recurrence protos.StringRecurrence `json:"recurrence" validate:"required"` + Termination time.Time `json:"termination" validate:"required"` +} + +func (c *CreateEventSeriesRequestBody) Validate() (*ValidatedCreateEventSeriesRequestBody, error) { + errors := make(map[string]string) + recurrence, err := protos.RecurrenceFrom(c.Recurrence) + if err != nil { + errors["Recurrence"] = fmt.Sprintf("%s failed %s", "Recurrence", "StringRecurrenceProto") + } + + if len(errors) > 0 { + return nil, utilities.InvalidRequestData(errors) + } + + return &ValidatedCreateEventSeriesRequestBody{ + CreateEventRequestBody: c.CreateEventRequestBody, + Recurrence: *recurrence, + Termination: c.Termination, + }, nil +} + +type ValidatedCreateEventSeriesRequestBody struct { + models.CreateEventRequestBody + Recurrence protos.Recurrence `json:"recurrence"` + Termination time.Time `json:"termination"` +} + +func (v *ValidatedCreateEventSeriesRequestBody) Into() *models.Event { + return v.CreateEventRequestBody.Into() +} + +type Series struct { + models.Model + Events []models.Event `gorm:"foreignKey:SeriesID" json:"events"` +} diff --git a/backend/entities/events/series/routes.go b/backend/entities/events/series/routes.go new file mode 100644 index 000000000..aaa97677d --- /dev/null +++ b/backend/entities/events/series/routes.go @@ -0,0 +1,32 @@ +package series + +import ( + "github.com/GenerateNU/sac/backend/extractors" + "github.com/GenerateNU/sac/backend/middleware" + "github.com/GenerateNU/sac/backend/types" +) + +func EventSeries(eventParams types.RouteParams) { + eventSeriesController := NewEventSeriesController(NewEventSeriesService(eventParams.ServiceParams)) + + // api/v1/events/series/* + eventSeries := eventParams.Router.Group("/series") + + eventSeries.Post( + "/", + middleware.AttachExtractor(eventParams.AuthMiddleware.ClubAuthorizeById, middleware.ExtractFromBody("host")), + eventSeriesController.CreateEventSeries, + ) + + eventSeriedID := eventSeries.Group("/:seriesID") + + eventSeriedID.Get("/", eventSeriesController.GetEventSeries) + eventSeriedID.Delete( + "/", + middleware.AttachExtractor( + eventParams.AuthMiddleware.ClubAuthorizeById, + middleware.FromExtractFromParamIntoQuery("seriesID", eventParams.ServiceParams.DB, extractors.GetSeriesHost), + ), + eventSeriesController.DeleteEventSeries, + ) +} diff --git a/backend/entities/events/series/service.go b/backend/entities/events/series/service.go new file mode 100644 index 000000000..d8886a31d --- /dev/null +++ b/backend/entities/events/series/service.go @@ -0,0 +1,78 @@ +package series + +import ( + "fmt" + + "github.com/GenerateNU/sac/backend/entities/models" + "github.com/GenerateNU/sac/backend/types" + "github.com/GenerateNU/sac/backend/utilities" + "github.com/google/uuid" +) + +type EventSeriesServiceInterface interface { + CreateEventSeries(body CreateEventSeriesRequestBody) (*Series, error) + GetEventSeries(seriesID string) ([]models.Event, error) + DeleteEventSeries(seriesID string) error +} + +type EventSeriesService struct { + types.ServiceParams +} + +func NewEventSeriesService(serviceParams types.ServiceParams) EventSeriesServiceInterface { + return &EventSeriesService{serviceParams} +} + +func (e *EventSeriesService) CreateEventSeries(body CreateEventSeriesRequestBody) (*Series, error) { + if err := utilities.Validate(e.Validate, body); err != nil { + return nil, err + } + + validatedBody, err := body.Validate() + if err != nil { + return nil, err + } + + if validatedBody.Termination.After(e.Calendar.MaxTerminationDate) { + return nil, utilities.BadRequest(fmt.Errorf("termination date is after max termination date. termination: %s, max termination: %s", validatedBody.Termination, e.Calendar.MaxTerminationDate)) + } + + rootEvent := validatedBody.Into() + + occurrences, err := validatedBody.Recurrence.ReccurUntil(rootEvent.StartTime, rootEvent.EndTime, validatedBody.Termination) + if err != nil { + return nil, utilities.BadRequest(fmt.Errorf("error creating recurring event series: %w", err)) + } + + events := make([]models.Event, len(occurrences)) + seriesID := uuid.New() + + for index, occurrence := range occurrences { + eventOccurence := *rootEvent + eventOccurence.ID = uuid.New() + eventOccurence.SeriesID = &seriesID + eventOccurence.StartTime = occurrence.Start + eventOccurence.EndTime = occurrence.End + events[index] = eventOccurence + } + + return CreateEventSeries(e.DB, seriesID, events) +} + +func (e *EventSeriesService) GetEventSeries(seriesID string) ([]models.Event, error) { + idAsUUID, err := utilities.ValidateID(seriesID) + if err != nil { + return nil, err + } + + return GetEventSeries(e.DB, *idAsUUID) +} + +func (e *EventSeriesService) DeleteEventSeries(seriesID string) error { + idAsUUID, err := utilities.ValidateID(seriesID) + if err != nil { + return err + } + + return DeleteEventSeries(e.DB, *idAsUUID) +} diff --git a/backend/entities/events/series/transactions.go b/backend/entities/events/series/transactions.go new file mode 100644 index 000000000..607c21b99 --- /dev/null +++ b/backend/entities/events/series/transactions.go @@ -0,0 +1,76 @@ +package series + +import ( + "errors" + + "github.com/GenerateNU/sac/backend/entities/models" + "github.com/GenerateNU/sac/backend/utilities" + "github.com/google/uuid" + "gorm.io/gorm" +) + +func createSeries(db *gorm.DB, seriesID uuid.UUID) (*Series, error) { + series := &Series{ + Model: models.Model{ + ID: seriesID, + }, + } + + if err := db.Create(series).Error; err != nil { + return nil, err + } + + return series, nil +} + +func CreateEventSeries(db *gorm.DB, seriesID uuid.UUID, events []models.Event) (*Series, error) { + tx := db.Begin() + defer func() { + if r := recover(); r != nil { + tx.Rollback() + } + }() + + if err := tx.Error; err != nil { + return nil, err + } + + series, err := createSeries(tx, seriesID) + if err != nil { + tx.Rollback() + return nil, err + } + + if err := tx.Create(&events).Error; err != nil { + tx.Rollback() + return nil, err + } + + series.Events = events + + return series, tx.Commit().Error +} + +func GetEventSeries(db *gorm.DB, seriesID uuid.UUID) ([]models.Event, error) { + var events []models.Event + + if err := db.Where("series_id = ?", seriesID).Find(&events).Error; err != nil { + if errors.Is(err, gorm.ErrRecordNotFound) { + return nil, utilities.ErrNotFound + } + return nil, err + } + + return events, nil +} + +func DeleteEventSeries(db *gorm.DB, seriesID uuid.UUID) error { + if err := db.Where("series_id = ?", seriesID).Delete(&models.Event{}).Error; err != nil { + if errors.Is(err, gorm.ErrRecordNotFound) { + return utilities.ErrNotFound + } + return err + } + + return nil +} diff --git a/backend/entities/events/tags/controller.go b/backend/entities/events/tags/controller.go new file mode 100644 index 000000000..347ab6241 --- /dev/null +++ b/backend/entities/events/tags/controller.go @@ -0,0 +1,48 @@ +package tags + +import ( + "net/http" + + "github.com/GenerateNU/sac/backend/utilities" + "github.com/gofiber/fiber/v2" +) + +type EventTagController struct { + eventTagService EventTagServiceInterface +} + +func NewEventTagController(eventTagService EventTagServiceInterface) *EventTagController { + return &EventTagController{eventTagService: eventTagService} +} + +func (e *EventTagController) CreateEventTags(c *fiber.Ctx) error { + var eventTagsBody CreateEventTagsRequestBody + if err := c.BodyParser(&eventTagsBody); err != nil { + return utilities.InvalidJSON() + } + + eventTags, err := e.eventTagService.CreateEventTags(c.Params("eventID"), eventTagsBody) + if err != nil { + return err + } + + return c.Status(http.StatusCreated).JSON(eventTags) +} + +func (e *EventTagController) GetEventTags(c *fiber.Ctx) error { + tags, err := e.eventTagService.GetEventTags(c.Params("eventID")) + if err != nil { + return err + } + + return c.Status(http.StatusCreated).JSON(tags) +} + +func (e *EventTagController) DeleteEventTag(c *fiber.Ctx) error { + err := e.eventTagService.DeleteEventTag(c.Params("eventID"), c.Params("tagID")) + if err != nil { + return err + } + + return c.SendStatus(http.StatusNoContent) +} diff --git a/backend/entities/events/tags/models.go b/backend/entities/events/tags/models.go new file mode 100644 index 000000000..6619f1fc2 --- /dev/null +++ b/backend/entities/events/tags/models.go @@ -0,0 +1,7 @@ +package tags + +import "github.com/google/uuid" + +type CreateEventTagsRequestBody struct { + Tags []uuid.UUID `json:"tags" validate:"required"` +} diff --git a/backend/entities/events/tags/routes.go b/backend/entities/events/tags/routes.go new file mode 100644 index 000000000..823647869 --- /dev/null +++ b/backend/entities/events/tags/routes.go @@ -0,0 +1,24 @@ +package tags + +import ( + "github.com/GenerateNU/sac/backend/middleware" + "github.com/GenerateNU/sac/backend/types" +) + +func EventTags(eventParams types.RouteParams) { + eventTagController := NewEventTagController(NewEventTagService(eventParams.ServiceParams)) + + eventTags := eventParams.Router.Group("/:eventID/tags") + + eventTags.Get("/", eventTagController.GetEventTags) + eventTags.Post( + "/", + middleware.AttachExtractor(eventParams.AuthMiddleware.EventAuthorizeById, middleware.ExtractFromParams("eventID")), + eventTagController.CreateEventTags, + ) + eventTags.Delete( + "/:tagID", + middleware.AttachExtractor(eventParams.AuthMiddleware.EventAuthorizeById, middleware.ExtractFromParams("eventID")), + eventTagController.DeleteEventTag, + ) +} diff --git a/backend/entities/events/tags/service.go b/backend/entities/events/tags/service.go new file mode 100644 index 000000000..b2287fb73 --- /dev/null +++ b/backend/entities/events/tags/service.go @@ -0,0 +1,63 @@ +package tags + +import ( + "github.com/GenerateNU/sac/backend/entities/models" + "github.com/GenerateNU/sac/backend/entities/tags" + "github.com/GenerateNU/sac/backend/types" + "github.com/GenerateNU/sac/backend/utilities" +) + +type EventTagServiceInterface interface { + CreateEventTags(id string, clubTagsBody CreateEventTagsRequestBody) ([]models.Tag, error) + GetEventTags(id string) ([]models.Tag, error) + DeleteEventTag(id string, tagId string) error +} + +type EventTagService struct { + types.ServiceParams +} + +func NewEventTagService(serviceParams types.ServiceParams) EventTagServiceInterface { + return &EventTagService{serviceParams} +} + +func (e *EventTagService) CreateEventTags(id string, eventTagsBody CreateEventTagsRequestBody) ([]models.Tag, error) { + idAsUUID, err := utilities.ValidateID(id) + if err != nil { + return nil, err + } + + if err := utilities.Validate(e.Validate, eventTagsBody); err != nil { + return nil, err + } + + tags, err := tags.GetTagsByIDs(e.DB, eventTagsBody.Tags) + if err != nil { + return nil, err + } + + return CreateEventTags(e.DB, *idAsUUID, tags) +} + +func (e *EventTagService) GetEventTags(id string) ([]models.Tag, error) { + idAsUUID, err := utilities.ValidateID(id) + if err != nil { + return nil, err + } + + return GetEventTags(e.DB, *idAsUUID) +} + +func (e *EventTagService) DeleteEventTag(id string, tagId string) error { + idAsUUID, err := utilities.ValidateID(id) + if err != nil { + return err + } + + tagIdAsUUID, err := utilities.ValidateID(tagId) + if err != nil { + return err + } + + return DeleteEventTag(e.DB, *idAsUUID, *tagIdAsUUID) +} diff --git a/backend/entities/events/tags/transactions.go b/backend/entities/events/tags/transactions.go new file mode 100644 index 000000000..a7815b074 --- /dev/null +++ b/backend/entities/events/tags/transactions.go @@ -0,0 +1,56 @@ +package tags + +import ( + "github.com/GenerateNU/sac/backend/entities/events" + + "github.com/GenerateNU/sac/backend/entities/models" + "github.com/GenerateNU/sac/backend/entities/tags" + "github.com/GenerateNU/sac/backend/transactions" + "github.com/google/uuid" + + "gorm.io/gorm" +) + +func CreateEventTags(db *gorm.DB, id uuid.UUID, tags []models.Tag) ([]models.Tag, error) { + event, err := events.GetEvent(db, id, transactions.PreloadTag()) + if err != nil { + return nil, err + } + + if err := db.Model(&event).Association("Tag").Append(tags); err != nil { + return nil, err + } + + return tags, nil +} + +func GetEventTags(db *gorm.DB, id uuid.UUID) ([]models.Tag, error) { + var tags []models.Tag + + event, err := events.GetEvent(db, id, transactions.PreloadTag()) + if err != nil { + return nil, err + } + + if err := db.Model(&event).Association("Tag").Find(&tags); err != nil { + return nil, err + } + return tags, nil +} + +func DeleteEventTag(db *gorm.DB, id uuid.UUID, tagID uuid.UUID) error { + event, err := events.GetEvent(db, id, transactions.PreloadTag()) + if err != nil { + return err + } + + tag, err := tags.GetTag(db, tagID) + if err != nil { + return err + } + + if err := db.Model(&event).Association("Tag").Delete(&tag); err != nil { + return err + } + return nil +} diff --git a/backend/entities/events/transactions.go b/backend/entities/events/transactions.go new file mode 100644 index 000000000..1a4b3ca7a --- /dev/null +++ b/backend/entities/events/transactions.go @@ -0,0 +1,51 @@ +package events + +import ( + "errors" + + "github.com/GenerateNU/sac/backend/entities/clubs" + "github.com/GenerateNU/sac/backend/entities/models" + "github.com/GenerateNU/sac/backend/transactions" + "github.com/GenerateNU/sac/backend/utilities" + "github.com/google/uuid" + "gorm.io/gorm" +) + +func GetEvent(db *gorm.DB, eventID uuid.UUID, preloads ...transactions.OptionalQuery) (*models.Event, error) { + var event models.Event + + query := db + + for _, preload := range preloads { + query = preload(query) + } + if err := query.First(&event, eventID).Error; err != nil { + if errors.Is(err, gorm.ErrRecordNotFound) { + return nil, utilities.ErrNotFound + } + return nil, err + } + + return &event, nil +} + +func GetEventHostAdminIDs(db *gorm.DB, eventID uuid.UUID) ([]uuid.UUID, error) { + event, err := GetEvent(db, eventID) + if err != nil { + return nil, err + } + + return clubs.GetAdminIDs(db, *event.Host) +} + +func GetFirstEventInSeries(db *gorm.DB, seriesID uuid.UUID) (*models.Event, error) { + var event models.Event + if err := db.Where("series_id = ?", seriesID).First(&event).Error; err != nil { + if errors.Is(err, gorm.ErrRecordNotFound) { + return nil, utilities.ErrNotFound + } + return nil, err + } + + return &event, nil +} diff --git a/backend/entities/models/club.go b/backend/entities/models/club.go index de31d9316..d8094b266 100644 --- a/backend/entities/models/club.go +++ b/backend/entities/models/club.go @@ -50,6 +50,7 @@ type Club struct { Comment []Comment `json:"-" validate:"-"` PointOfContact []PointOfContact `json:"-" validate:"-"` Contact []Contact `json:"-" validate:"-"` + // Event HostEvent []Event `gorm:"foreignKey:Host;" json:"-" validate:"-"` Event []Event `gorm:"many2many:club_events;" json:"-" validate:"-"` @@ -57,7 +58,7 @@ type Club struct { } type CreateClubRequestBody struct { - UserID uuid.UUID `json:"user_id" validate:"required,uuid4"` + UserID uuid.UUID `json:"user_id" validate:"required,uuid4"` // TODO: huh? Name string `json:"name" validate:"required,max=255"` Preview string `json:"preview" validate:"required,max=255"` Description string `json:"description" validate:"required,http_url,s3_url,max=255"` diff --git a/backend/entities/models/event.go b/backend/entities/models/event.go index 74b0185da..a2e23dc9d 100644 --- a/backend/entities/models/event.go +++ b/backend/entities/models/event.go @@ -9,32 +9,38 @@ import ( type EventType string const ( - Open EventType = "open" - MembersOnly EventType = "membersOnly" -) - -type RecurringType string - -const ( - Daily RecurringType = "daily" - Weekly RecurringType = "weekly" - Monthly RecurringType = "monthly" + Hybrid EventType = "hybrid" + InPerson EventType = "in_person" + Virtual EventType = "virtual" ) type Event struct { Model + // details Name string `json:"name" validate:"required,max=255"` Preview string `json:"preview" validate:"required,max=255"` - Content string `json:"content" validate:"required,max=255"` - StartTime time.Time `json:"start_time" validate:"required,ltecsfield=EndTime"` - EndTime time.Time `json:"end_time" validate:"required,gtecsfield=StartTime"` - Location string `json:"location" validate:"required,max=255"` - EventType EventType `json:"event_type" validate:"required,max=255,oneof=open membersOnly"` - IsRecurring bool `json:"is_recurring" validate:"-"` - MeetingLink string `json:"meeting_link" validate:"url"` + Description string `json:"description" validate:"required,max=255"` Host *uuid.UUID `json:"host" validate:"uuid4"` + // geoshi + EventType EventType `json:"event_type" validate:"required,max=255,oneof=hybrid in_person virtual"` + Location string `json:"location" validate:"max=255,required_if=EventType in_person,required_if=EventType hybrid"` + Link string `json:"link" validate:"url,max=255,required_if=EventType virtual,required_if=EventType hybrid"` + + // internal housekeeping states + IsPublic bool `json:"is_public" validate:"required"` + IsDraft bool `json:"is_draft" validate:"required"` + IsArchived bool `json:"is_archived" validate:"required"` + + // timing + StartTime time.Time `json:"start_time" validate:"required,ltefield=EndTime"` + EndTime time.Time `json:"end_time" validate:"required,gtefield=StartTime"` + + // series + SeriesID *uuid.UUID `json:"-" validate:"-"` + + // bridgerton RSVP []User `gorm:"many2many:user_event_rsvps;" json:"-" validate:"-"` Waitlist []User `gorm:"many2many:user_event_waitlists;" json:"-" validate:"-"` Clubs []Club `gorm:"many2many:club_events;" json:"-" validate:"-"` @@ -42,78 +48,65 @@ type Event struct { Notification []Notification `gorm:"polymorphic:Reference;" json:"-" validate:"-"` } -type Series struct { - Model - RecurringType RecurringType `json:"recurring_type" validate:"max=255"` - MaxOccurrences int `json:"max_occurrences" validate:"min=1"` - Events []Event `gorm:"many2many:event_series;" json:"events" validate:"-"` -} - -type EventSeries struct { - EventID uuid.UUID `json:"event_id" validate:"uuid4"` - Event Event `json:"-" validate:"-"` - SeriesID uuid.UUID `json:"series_id" validate:"uuid4"` - Series Series `json:"-" validate:"-"` -} - -// Not needed for now, we will just update the events separately -type EventInstanceException struct { - Model - EventID int `json:"event_id" validate:"required"` - Event Event - IsRescheduled bool `json:"is_rescheduled" validate:"required"` - IsCancelled bool `json:"is_cancelled" validate:"required"` - StartTime time.Time `json:"start_time" validate:"required,datetime,ltecsfield=EndTime"` - EndTime time.Time `json:"end_time" validate:"required,datetime,gtecsfield=StartTime"` -} - -// TODO We will likely need to update the create and update structs to account for recurring series type CreateEventRequestBody struct { + // details Name string `json:"name" validate:"required,max=255"` Preview string `json:"preview" validate:"required,max=255"` - Content string `json:"content" validate:"required,max=255"` - StartTime time.Time `json:"start_time" validate:"required,ltecsfield=EndTime"` - EndTime time.Time `json:"end_time" validate:"required,gtecsfield=StartTime"` - Location string `json:"location" validate:"required,max=255"` - EventType EventType `json:"event_type" validate:"required,max=255,oneof=open membersOnly"` - IsRecurring *bool `json:"is_recurring" validate:"required"` - - // TODO club/tag/notification logic - Host *uuid.UUID `json:"host" validate:"required,uuid4"` - Clubs []Club `json:"-" validate:"omitempty"` - Tag []Tag `json:"-" validate:"omitempty"` - Notification []Notification `json:"-" validate:"omitempty"` - - // TODO validate if isRecurring, then series is required - Series CreateSeriesRequestBody `json:"series" validate:"-"` + Description string `json:"description" validate:"required,max=255"` + HostID uuid.UUID `json:"host" validate:"uuid4"` // TODO ensure you are an admin of the host + + // geoshi + EventType EventType `json:"event_type" validate:"required,max=255,oneof=hybrid in_person virtual"` + Location string `json:"location" validate:"max=255,required_if=EventType in_person,required_if=EventType hybrid"` + Link string `json:"link" validate:"http_url,max=255,required_if=EventType virtual,required_if=EventType hybrid"` + + // internal housekeeping states + IsPublic *bool `json:"is_public" validate:"required"` + IsDraft *bool `json:"is_draft" validate:"required"` // some logic here. drafts shouldn't be public + IsArchived *bool `json:"is_archived" validate:"required"` + + // timing + StartTime time.Time `json:"start_time" validate:"required,ltefield=EndTime"` + EndTime time.Time `json:"end_time" validate:"required,gtefield=StartTime"` } -type CreateSeriesRequestBody struct { - RecurringType RecurringType `json:"recurring_type" validate:"required,max=255,oneof=daily weekly monthly"` - MaxOccurrences int `json:"max_occurrences" validate:"required,min=2"` +func (c *CreateEventRequestBody) Into() *Event { + return &Event{ + Name: c.Name, + Preview: c.Preview, + Description: c.Description, + Host: &c.HostID, + EventType: c.EventType, + Location: c.Location, + Link: c.Link, + IsPublic: *c.IsPublic, + IsDraft: *c.IsDraft, + IsArchived: *c.IsArchived, + StartTime: c.StartTime, + EndTime: c.EndTime, + } } type UpdateEventRequestBody struct { - Name string `json:"name" validate:"omitempty,max=255"` - Preview string `json:"preview" validate:"omitempty,max=255"` - Content string `json:"content" validate:"omitempty,max=255"` + // details + Name string `json:"name" validate:"omitempty,max=255"` + Preview string `json:"preview" validate:"omitempty,max=255"` + Description string `json:"description" validate:"omitempty,max=255"` + HostID *uuid.UUID `json:"host" validate:"omitempty,uuid4"` + + // geoshi + EventType EventType `json:"event_type" validate:"omitempty,max=255,oneof=hybrid in_person virtual"` + Location string `json:"location" validate:"omitempty,max=255,required_if=EventType in_person,required_if=EventType hybrid"` + Link string `json:"link" validate:"omitempty,url,max=255,required_if=EventType virtual,required_if=EventType hybrid"` + + // internal housekeeping states + IsPublic bool `json:"is_public" validate:"omitempty"` + IsDraft bool `json:"is_draft" validate:"omitempty"` + IsArchived bool `json:"is_archived" validate:"omitempty"` + + // timing StartTime time.Time `json:"start_time" validate:"omitempty,ltecsfield=EndTime"` EndTime time.Time `json:"end_time" validate:"omitempty,gtecsfield=StartTime"` - Location string `json:"location" validate:"omitempty,max=255"` - EventType EventType `json:"event_type" validate:"omitempty,max=255,oneof=open membersOnly"` - - Host *uuid.UUID `json:"host" validate:"omitempty"` - RSVP []User `json:"-" validate:"omitempty"` - Waitlist []User `json:"-" validate:"omitempty"` - Clubs []Club `json:"-" validate:"omitempty"` - Tag []Tag `json:"-" validate:"omitempty"` - Notification []Notification `json:"-" validate:"omitempty"` -} - -// TODO: probably need to make changes to this to update the events as well -type UpdateSeriesRequestBody struct { - RecurringType RecurringType `json:"recurring_type" validate:"omitempty,max=255,oneof=daily weekly monthly"` - MaxOccurrences int `json:"max_occurrences" validate:"omitempty,min=2"` - EventDetails UpdateEventRequestBody `json:"event_details" validate:"omitempty"` + UpdateAllInSeries *bool `json:"update_all_in_series" validate:"required"` } diff --git a/backend/entities/tags/base/service.go b/backend/entities/tags/base/service.go index e29c97620..3dd4f238c 100644 --- a/backend/entities/tags/base/service.go +++ b/backend/entities/tags/base/service.go @@ -31,7 +31,7 @@ func (t *TagService) CreateTag(tagBody models.CreateTagRequestBody) (*models.Tag return nil, err } - tag, err := utilities.MapRequestToModel(tagBody, &models.Tag{}) + tag, err := utilities.MapJsonTags(tagBody, &models.Tag{}) if err != nil { return nil, err } @@ -66,7 +66,7 @@ func (t *TagService) UpdateTag(tagID string, tagBody models.UpdateTagRequestBody return nil, err } - tag, err := utilities.MapRequestToModel(tagBody, &models.Tag{}) + tag, err := utilities.MapJsonTags(tagBody, &models.Tag{}) if err != nil { return nil, err } diff --git a/backend/entities/users/base/service.go b/backend/entities/users/base/service.go index bc7792325..5b3bf7037 100644 --- a/backend/entities/users/base/service.go +++ b/backend/entities/users/base/service.go @@ -70,7 +70,7 @@ func (u *UserService) UpdateUser(id string, userBody models.UpdateUserRequestBod return nil, err } - user, err := utilities.MapRequestToModel(userBody, &models.User{}) + user, err := utilities.MapJsonTags(userBody, &models.User{}) if err != nil { return nil, err } diff --git a/backend/extractors/series.go b/backend/extractors/series.go new file mode 100644 index 000000000..3931149f7 --- /dev/null +++ b/backend/extractors/series.go @@ -0,0 +1,16 @@ +package extractors + +import ( + "github.com/GenerateNU/sac/backend/entities/events" + "github.com/google/uuid" + "gorm.io/gorm" +) + +func GetSeriesHost(db *gorm.DB, seriesID uuid.UUID) (*uuid.UUID, error) { + event, err := events.GetFirstEventInSeries(db, seriesID) + if err != nil { + return nil, err + } + + return event.Host, nil +} diff --git a/backend/go.mod b/backend/go.mod index c0c5d0e2c..cff7af345 100644 --- a/backend/go.mod +++ b/backend/go.mod @@ -18,7 +18,6 @@ require ( github.com/huandu/go-assert v1.1.6 github.com/joho/godotenv v1.5.1 github.com/mcnijman/go-emailaddress v1.1.1 - github.com/mitchellh/mapstructure v1.5.0 github.com/resend/resend-go/v2 v2.6.0 github.com/sahilm/fuzzy v0.1.1 github.com/spf13/viper v1.18.2 @@ -45,6 +44,7 @@ require ( github.com/hashicorp/go-multierror v1.1.1 // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect github.com/lib/pq v1.10.9 // indirect + github.com/mitchellh/mapstructure v1.5.0 // indirect go.uber.org/atomic v1.11.0 // indirect ) @@ -60,6 +60,7 @@ require ( github.com/go-openapi/swag v0.23.0 // indirect github.com/go-playground/locales v0.14.1 // indirect github.com/go-playground/universal-translator v0.18.1 // indirect + github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 github.com/golang-migrate/migrate/v4 v4.17.1 github.com/hashicorp/hcl v1.0.0 // indirect github.com/jackc/pgpassfile v1.0.0 // indirect diff --git a/backend/go.sum b/backend/go.sum index 65b25dc8b..dfa72fd5b 100644 --- a/backend/go.sum +++ b/backend/go.sum @@ -56,6 +56,8 @@ github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJn github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= github.com/go-playground/validator/v10 v10.20.0 h1:K9ISHbSaI0lyB2eWMPJo+kOS/FBExVwjEviJTixqxL8= github.com/go-playground/validator/v10 v10.20.0/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM= +github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= +github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= github.com/gofiber/fiber/v2 v2.52.4 h1:P+T+4iK7VaqUsq2PALYEfBBo6bJZ4q3FP8cZ84EggTM= diff --git a/backend/main.go b/backend/main.go index 576ab6feb..27d524daf 100644 --- a/backend/main.go +++ b/backend/main.go @@ -34,11 +34,11 @@ func Exit(format string, a ...interface{}) { } func configureIntegrations(config *config.Settings, connectToPinecone bool) integrations.Integrations { - openAi := search.NewOpenAIClient(config.OpenAISettings) + openAi := search.NewOpenAIClient(config.OpenAI) var pinecone search.SearchClientInterface if connectToPinecone { - pinecone = search.NewPineconeClient(openAi, config.PineconeSettings) + pinecone = search.NewPineconeClient(openAi, config.Pinecone) } else { pinecone = mocks.NewPineconeMockClient() } @@ -46,7 +46,7 @@ func configureIntegrations(config *config.Settings, connectToPinecone bool) inte integrations := integrations.Integrations{ File: file.NewAWSProvider(config.AWS), AI: openAi, - Email: email.NewResendClient(config.ResendSettings, true), + Email: email.NewResendClient(config.Resend, true), Search: pinecone, } return integrations @@ -81,8 +81,8 @@ func main() { } if *onlySeedPinecone { - openAi := search.NewOpenAIClient(config.OpenAISettings) - pinecone := search.NewPineconeClient(openAi, config.PineconeSettings) + openAi := search.NewOpenAIClient(config.OpenAI) + pinecone := search.NewPineconeClient(openAi, config.Pinecone) err := pinecone.Seed(db) if err != nil { diff --git a/backend/middleware/auth.go b/backend/middleware/auth.go index 84337e72d..7538efdd3 100644 --- a/backend/middleware/auth.go +++ b/backend/middleware/auth.go @@ -45,32 +45,34 @@ func GetAuthroizationToken(c *fiber.Ctx) *string { } func (m *AuthMiddlewareService) Authenticate(c *fiber.Ctx) error { - accessToken := GetAuthroizationToken(c) - if accessToken == nil { - return utilities.Unauthorized() - } + return func(c *fiber.Ctx) error { + accessToken := GetAuthroizationToken(c) + if accessToken == nil { + return utilities.Unauthorized() + } - token, err := func() (*jwt.Token, error) { - return jwt.ParseWithClaims(*accessToken, &auth.CustomClaims{}, func(token *jwt.Token) (interface{}, error) { - return []byte(m.Auth.AccessKey.Expose()), nil - }) - }() - if err != nil { - return utilities.Unauthorized() - } + token, err := func() (*jwt.Token, error) { + return jwt.ParseWithClaims(*accessToken, &auth.CustomClaims{}, func(token *jwt.Token) (interface{}, error) { + return []byte(m.Auth.AccessKey.Expose()), nil + }) + }() + if err != nil { + return utilities.Unauthorized() + } - claims, ok := token.Claims.(*auth.CustomClaims) - if !ok || !token.Valid { - return utilities.Unauthorized() - } + claims, ok := token.Claims.(*auth.CustomClaims) + if !ok || !token.Valid { + return utilities.Unauthorized() + } - // if auth.IsBlacklisted(*accessToken) { - // return errors.Unauthorized.FiberError(c) - // } + // if auth.IsBlacklisted(*accessToken) { + // return errors.Unauthorized.FiberError(c) + // } - c.Locals("claims", claims) + c.Locals("claims", claims) - return nil + return nil + }(c) } func (m *AuthMiddlewareService) Authorize(requiredPermissions ...auth.Permission) func(c *fiber.Ctx) error { diff --git a/backend/middleware/club.go b/backend/middleware/club.go index 751ee6acc..4c9560696 100644 --- a/backend/middleware/club.go +++ b/backend/middleware/club.go @@ -10,38 +10,40 @@ import ( ) // Authorizes admins of the specific club to make this request, skips check if super user -func (m *AuthMiddlewareService) ClubAuthorizeById(c *fiber.Ctx) error { - if err := m.Authenticate(c); err != nil { - return utilities.Unauthorized() - } - - if m.IsSuper(c) { - return c.Next() - } - - clubUUID, err := utilities.ValidateID(c.Params("clubID")) - if err != nil { - return err - } - - claims, err := auth.From(c) - if err != nil { - return err - } - - issuerUUID, err := utilities.ValidateID(claims.Issuer) - if err != nil { - return err - } - - clubAdmin, err := clubs.GetAdminIDs(m.DB, *clubUUID) - if err != nil { - return err - } - - if slices.Contains(clubAdmin, *issuerUUID) { - return c.Next() - } - - return utilities.Forbidden() +func (m *AuthMiddlewareService) ClubAuthorizeById(c *fiber.Ctx, extractor ExtractID) error { + return func(c *fiber.Ctx) error { + if err := m.Authenticate(c); err != nil { + return utilities.Unauthorized() + } + + if m.IsSuper(c) { + return c.Next() + } + + clubUUID, err := extractor(c) + if err != nil { + return err + } + + claims, err := auth.From(c) + if err != nil { + return err + } + + issuerUUID, err := utilities.ValidateID(claims.Issuer) + if err != nil { + return err + } + + clubAdmin, err := clubs.GetAdminIDs(m.DB, *clubUUID) + if err != nil { + return err + } + + if slices.Contains(clubAdmin, *issuerUUID) { + return c.Next() + } + + return utilities.Forbidden() + }(c) } diff --git a/backend/middleware/event.go b/backend/middleware/event.go new file mode 100644 index 000000000..b8a371fa5 --- /dev/null +++ b/backend/middleware/event.go @@ -0,0 +1,49 @@ +package middleware + +import ( + "slices" + + "github.com/GenerateNU/sac/backend/auth" + "github.com/GenerateNU/sac/backend/entities/events" + "github.com/GenerateNU/sac/backend/utilities" + "github.com/gofiber/fiber/v2" +) + +// Authorizes admins of the host club of this event to make this request, skips check if super user +func (m *AuthMiddlewareService) EventAuthorizeById(c *fiber.Ctx, extractor ExtractID) error { + return func(c *fiber.Ctx) error { + if err := m.Authenticate(c); err != nil { + return utilities.Unauthorized() + } + + if m.IsSuper(c) { + return c.Next() + } + + eventUUID, err := extractor(c) + if err != nil { + return err + } + + claims, err := auth.From(c) + if err != nil { + return err + } + + issuerUUID, err := utilities.ValidateID(claims.Issuer) + if err != nil { + return err + } + + eventHostAdmin, err := events.GetEventHostAdminIDs(m.DB, *eventUUID) + if err != nil { + return err + } + + if slices.Contains(eventHostAdmin, *issuerUUID) { + return c.Next() + } + + return utilities.Forbidden() + }(c) +} diff --git a/backend/middleware/extractor.go b/backend/middleware/extractor.go new file mode 100644 index 000000000..a9b4bcc37 --- /dev/null +++ b/backend/middleware/extractor.go @@ -0,0 +1,81 @@ +package middleware + +import ( + "errors" + "fmt" + + go_json "github.com/goccy/go-json" + "gorm.io/gorm" + + "github.com/GenerateNU/sac/backend/utilities" + "github.com/gofiber/fiber/v2" + "github.com/google/uuid" +) + +type ExtractID func(*fiber.Ctx) (*uuid.UUID, error) + +func AttachExtractor(middleware func(c *fiber.Ctx, extractor ExtractID) error, extractor ExtractID) fiber.Handler { + return func(c *fiber.Ctx) error { + return middleware(c, extractor) + } +} + +func ExtractFromParams(param string) ExtractID { + return func(c *fiber.Ctx) (*uuid.UUID, error) { + return utilities.ValidateID(c.Params(param)) + } +} + +func ExtractFromBody(key string) ExtractID { + return func(c *fiber.Ctx) (*uuid.UUID, error) { + var bodyMap map[string]string + + bodyBytes := c.BodyRaw() + + if len(bodyBytes) == 0 { + return nil, errors.New("empty request body") + } + + err := go_json.Unmarshal(bodyBytes, &bodyMap) + if err != nil { + return nil, err + } + + id, ok := bodyMap[key] + if !ok { + return nil, fmt.Errorf("missing key %s in request body", key) + } + + return utilities.ValidateID(id) + } +} + +type QueryFn func(*gorm.DB, uuid.UUID) (*uuid.UUID, error) + +func ExtractFromQuery(db *gorm.DB, id uuid.UUID, query QueryFn) ExtractID { + return func(c *fiber.Ctx) (*uuid.UUID, error) { + id, err := query(db, id) + if err != nil { + return nil, err + } + + return id, nil + } +} + +func ExtractFromParamIntoQuery(param string, db *gorm.DB, query QueryFn) ExtractID { + return func(c *fiber.Ctx) (*uuid.UUID, error) { + id, err := ExtractFromParams(param)(c) + if err != nil { + return nil, err + } + + return ExtractFromQuery(db, *id, query)(c) + } +} + +func FromExtractFromParamIntoQuery(param string, db *gorm.DB, query QueryFn) ExtractID { + return func(c *fiber.Ctx) (*uuid.UUID, error) { + return ExtractFromParamIntoQuery(param, db, query)(c) + } +} diff --git a/backend/middleware/user.go b/backend/middleware/user.go index 6a30b30ca..62b040bd9 100644 --- a/backend/middleware/user.go +++ b/backend/middleware/user.go @@ -7,32 +7,34 @@ import ( ) func (m *AuthMiddlewareService) UserAuthorizeById(c *fiber.Ctx) error { - if err := m.Authenticate(c); err != nil { - return utilities.Unauthorized() - } - - if m.IsSuper(c) { - return c.Next() - } - - idAsUUID, err := utilities.ValidateID(c.Params("userID")) - if err != nil { - return err - } - - claims, err := auth.From(c) - if err != nil { - return err - } - - issuerIDAsUUID, err := utilities.ValidateID(claims.Issuer) - if err != nil { - return err - } - - if issuerIDAsUUID.String() == idAsUUID.String() { - return c.Next() - } - - return utilities.Forbidden() + return func(c *fiber.Ctx) error { + if err := m.Authenticate(c); err != nil { + return utilities.Unauthorized() + } + + if m.IsSuper(c) { + return c.Next() + } + + idAsUUID, err := utilities.ValidateID(c.Params("userID")) + if err != nil { + return err + } + + claims, err := auth.From(c) + if err != nil { + return err + } + + issuerIDAsUUID, err := utilities.ValidateID(claims.Issuer) + if err != nil { + return err + } + + if issuerIDAsUUID.String() == idAsUUID.String() { + return c.Next() + } + + return utilities.Forbidden() + }(c) } diff --git a/backend/migrations/000001_init.down.sql b/backend/migrations/000001_init.down.sql index 71f9ab58b..53a2ab3b3 100644 --- a/backend/migrations/000001_init.down.sql +++ b/backend/migrations/000001_init.down.sql @@ -18,8 +18,6 @@ DROP TABLE IF EXISTS contacts CASCADE; DROP TABLE IF EXISTS series CASCADE; -DROP TABLE IF EXISTS event_series CASCADE; - DROP TABLE IF EXISTS event_tags CASCADE; DROP TABLE IF EXISTS files CASCADE; @@ -42,4 +40,6 @@ DROP TABLE IF EXISTS user_tags CASCADE; DROP TABLE IF EXISTS verifications CASCADE; -COMMIT; \ No newline at end of file +DROP EXTENSION IF EXISTS "uuid-ossp"; + +COMMIT; diff --git a/backend/migrations/000001_init.up.sql b/backend/migrations/000001_init.up.sql index d85dd8355..16cf627f0 100644 --- a/backend/migrations/000001_init.up.sql +++ b/backend/migrations/000001_init.up.sql @@ -41,22 +41,33 @@ CREATE TABLE IF NOT EXISTS clubs( PRIMARY KEY(id) ); +CREATE TABLE IF NOT EXISTS series( + id uuid NOT NULL DEFAULT uuid_generate_v4(), + created_at timestamp without time zone NOT NULL DEFAULT CURRENT_TIMESTAMP, + updated_at timestamp without time zone NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY(id) +); + CREATE TABLE IF NOT EXISTS events( id uuid NOT NULL DEFAULT uuid_generate_v4(), created_at timestamp without time zone NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at timestamp without time zone NOT NULL DEFAULT CURRENT_TIMESTAMP, name varchar(255) NOT NULL, preview varchar(255) NOT NULL, - content text NOT NULL, - start_time timestamp with time zone NOT NULL, - end_time timestamp with time zone NOT NULL, - location varchar(255) NOT NULL, - event_type varchar(255) NOT NULL DEFAULT 'open'::character varying, - is_recurring boolean NOT NULL DEFAULT false, - meeting_link varchar(255), + description varchar(255) NOT NULL, + event_type varchar(255) NOT NULL, + location varchar(255), + link varchar(255), + is_public boolean NOT NULL, + is_draft boolean NOT NULL, + is_archived boolean NOT NULL, + start_time timestamp without time zone NOT NULL, + end_time timestamp without time zone NOT NULL, host uuid NOT NULL, + series_id uuid, PRIMARY KEY(id), - CONSTRAINT fk_clubs_host_event FOREIGN key(host) REFERENCES clubs(id) ON UPDATE CASCADE ON DELETE CASCADE + CONSTRAINT fk_clubs_host_event FOREIGN key(host) REFERENCES clubs(id) ON UPDATE CASCADE ON DELETE CASCADE, + CONSTRAINT fk_series_event FOREIGN key(series_id) REFERENCES series(id) ON UPDATE CASCADE ON DELETE CASCADE ); CREATE TABLE IF NOT EXISTS categories( @@ -109,22 +120,6 @@ CREATE TABLE IF NOT EXISTS contacts( CREATE UNIQUE INDEX IF NOT EXISTS idx_contact_type ON contacts USING btree ("type","club_id"); -CREATE TABLE IF NOT EXISTS series( - id uuid NOT NULL DEFAULT uuid_generate_v4(), - created_at timestamp without time zone NOT NULL DEFAULT CURRENT_TIMESTAMP, - updated_at timestamp without time zone NOT NULL DEFAULT CURRENT_TIMESTAMP, - recurring_type varchar(255) NOT NULL DEFAULT 'open'::character varying, - max_occurrences bigint NOT NULL, - PRIMARY KEY(id) -); - -CREATE TABLE IF NOT EXISTS event_series( - event_id uuid NOT NULL, - series_id uuid NOT NULL, - CONSTRAINT fk_event_series_event FOREIGN key(event_id) REFERENCES events(id) ON UPDATE CASCADE ON DELETE CASCADE, - CONSTRAINT fk_event_series_series FOREIGN key(series_id) REFERENCES series(id) ON UPDATE CASCADE ON DELETE CASCADE -); - CREATE TABLE IF NOT EXISTS event_tags( tag_id uuid NOT NULL DEFAULT uuid_generate_v4(), event_id uuid NOT NULL DEFAULT uuid_generate_v4(), @@ -239,4 +234,4 @@ CREATE TABLE IF NOT EXISTS verifications( ); CREATE UNIQUE INDEX IF NOT EXISTS uni_verifications_token ON verifications USING btree ("token"); -COMMIT; \ No newline at end of file +COMMIT; diff --git a/backend/protos/recurrence.go b/backend/protos/recurrence.go new file mode 100644 index 000000000..75d85b2ea --- /dev/null +++ b/backend/protos/recurrence.go @@ -0,0 +1,291 @@ +package protos + +import ( + "errors" + "slices" + "time" +) + +type Cadence int + +const ( + Weekly Cadence = iota + Biweekly + Monthly +) + +type Recurrence struct { + Cadence Cadence + HappensOnMonday bool + HappensOnTuesday bool + HappensOnWednesday bool + HappensOnThursday bool + HappensOnFriday bool + HappensOnSaturday bool + HappensOnSunday bool +} + +func NewRecurrence(cadence Cadence, happensOn ...HappensOn) (*Recurrence, error) { + if len(happensOn) == 0 { + return nil, errors.New("at least one happensOn function must be provided") + } + + var r Recurrence + r.Cadence = cadence + for _, happens := range happensOn { + r = happens(r) + } + + return &r, nil +} + +func (r *Recurrence) HappensOn() []time.Weekday { + var result []time.Weekday + if r.HappensOnMonday { + result = append(result, time.Monday) + } + if r.HappensOnTuesday { + result = append(result, time.Tuesday) + } + if r.HappensOnWednesday { + result = append(result, time.Wednesday) + } + if r.HappensOnThursday { + result = append(result, time.Thursday) + } + if r.HappensOnFriday { + result = append(result, time.Friday) + } + if r.HappensOnSaturday { + result = append(result, time.Saturday) + } + if r.HappensOnSunday { + result = append(result, time.Sunday) + } + + return result +} + +type HappensOn func(Recurrence) Recurrence + +func Monday(r Recurrence) Recurrence { + r.HappensOnMonday = true + return r +} + +func Tuesday(r Recurrence) Recurrence { + r.HappensOnTuesday = true + return r +} + +func Wednesday(r Recurrence) Recurrence { + r.HappensOnWednesday = true + return r +} + +func Thursday(r Recurrence) Recurrence { + r.HappensOnThursday = true + return r +} + +func Friday(r Recurrence) Recurrence { + r.HappensOnFriday = true + return r +} + +func Saturday(r Recurrence) Recurrence { + r.HappensOnSaturday = true + return r +} + +func Sunday(r Recurrence) Recurrence { + r.HappensOnSunday = true + return r +} + +type Occurrence struct { + Start time.Time + End time.Time +} + +func (r *Recurrence) ReccurUntil(start time.Time, end time.Time, termination time.Time) (result []Occurrence, err error) { + if start.After(end) { + return nil, errors.New("start date is after end date") + } + + if start.After(termination) { + return nil, errors.New("start date is after termination date") + } + + if end.After(termination) { + return nil, errors.New("end date is after termination date") + } + + if !slices.Contains(r.HappensOn(), start.Weekday()) { + return nil, errors.New("start date is on a day that the recurrence does not happen on") + } + + var monthIncrement int + switch r.Cadence { + case Weekly: + monthIncrement = 0 + case Biweekly: + monthIncrement = 0 + case Monthly: + monthIncrement = 1 + } + + var dayIncrement int + switch r.Cadence { + case Weekly: + dayIncrement = 7 + case Biweekly: + dayIncrement = 14 + case Monthly: + dayIncrement = 0 + } + + current := start + currentEnd := end + for current.Before(termination) { + if current.After(currentEnd) { + break + } + + if r.HappensOnMonday && current.Weekday() == time.Monday { + result = append(result, Occurrence{current, currentEnd}) + } + if r.HappensOnTuesday && current.Weekday() == time.Tuesday { + result = append(result, Occurrence{current, currentEnd}) + } + if r.HappensOnWednesday && current.Weekday() == time.Wednesday { + result = append(result, Occurrence{current, currentEnd}) + } + if r.HappensOnThursday && current.Weekday() == time.Thursday { + result = append(result, Occurrence{current, currentEnd}) + } + if r.HappensOnFriday && current.Weekday() == time.Friday { + result = append(result, Occurrence{current, currentEnd}) + } + if r.HappensOnSaturday && current.Weekday() == time.Saturday { + result = append(result, Occurrence{current, currentEnd}) + } + if r.HappensOnSunday && current.Weekday() == time.Sunday { + result = append(result, Occurrence{current, currentEnd}) + } + + current = current.AddDate(0, monthIncrement, dayIncrement) + currentEnd = currentEnd.AddDate(0, monthIncrement, dayIncrement) + } + + return result, nil +} + +const ( + // housekeeping + PROTO_VERSION rune = '1' + PROTO_SIZE int = 9 + + // indices + VERSION_INDEX int = 0 + CADENCE_INDEX int = 1 + START_DAYS_OF_WEEK_INDEX int = 2 + END_DAYS_OF_WEEK_INDEX int = 9 +) + +// PROTO v1 +// 0: [proto version] +// 1: [cadence] +// 2: [does this occur on Monday?] +// 3: [does this occur on Tuesday?] +// 4: [does this occur on Wednesday?] +// 5: [does this occur on Thursday?] +// 6: [does this occur on Friday?] +// 7: [does this occur on Saturday?] +// 8: [does this occur on Sunday?] +type StringRecurrence string + +func (r *Recurrence) Into() string { + data := make([]rune, PROTO_SIZE) + + data[VERSION_INDEX] = PROTO_VERSION + + switch r.Cadence { + case Weekly: + data[CADENCE_INDEX] = '0' + case Biweekly: + data[CADENCE_INDEX] = '1' + case Monthly: + data[CADENCE_INDEX] = '2' + } + + if r.HappensOnMonday { + data[START_DAYS_OF_WEEK_INDEX] = '1' + } + if r.HappensOnTuesday { + data[START_DAYS_OF_WEEK_INDEX+1] = '1' + } + if r.HappensOnWednesday { + data[START_DAYS_OF_WEEK_INDEX+2] = '1' + } + if r.HappensOnThursday { + data[START_DAYS_OF_WEEK_INDEX+3] = '1' + } + if r.HappensOnFriday { + data[START_DAYS_OF_WEEK_INDEX+4] = '1' + } + if r.HappensOnSaturday { + data[START_DAYS_OF_WEEK_INDEX+5] = '1' + } + if r.HappensOnSunday { + data[START_DAYS_OF_WEEK_INDEX+6] = '1' + } + + return string(data) +} + +func RecurrenceFrom(raw StringRecurrence) (recurrence *Recurrence, err error) { + runes := []rune(raw) + + if runes[VERSION_INDEX] != PROTO_VERSION { + return nil, errors.New("invalid version") + } + + if len(runes) != PROTO_SIZE { + return nil, errors.New("invalid data length") + } + + if runes[CADENCE_INDEX] != '0' && runes[CADENCE_INDEX] != '1' && runes[CADENCE_INDEX] != '2' { + return nil, errors.New("invalid cadence") + } + + cadence := int(runes[CADENCE_INDEX] - '0') + + var happensOn []HappensOn + if runes[START_DAYS_OF_WEEK_INDEX] == '1' { + happensOn = append(happensOn, Monday) + } + if runes[START_DAYS_OF_WEEK_INDEX+1] == '1' { + happensOn = append(happensOn, Tuesday) + } + if runes[START_DAYS_OF_WEEK_INDEX+2] == '1' { + happensOn = append(happensOn, Wednesday) + } + if runes[START_DAYS_OF_WEEK_INDEX+3] == '1' { + happensOn = append(happensOn, Thursday) + } + if runes[START_DAYS_OF_WEEK_INDEX+4] == '1' { + happensOn = append(happensOn, Friday) + } + if runes[START_DAYS_OF_WEEK_INDEX+5] == '1' { + happensOn = append(happensOn, Saturday) + } + if runes[START_DAYS_OF_WEEK_INDEX+6] == '1' { + happensOn = append(happensOn, Sunday) + } + + return NewRecurrence( + Cadence(cadence), + happensOn..., + ) +} diff --git a/backend/server/server.go b/backend/server/server.go index b5e6fd3cb..54bb31e75 100644 --- a/backend/server/server.go +++ b/backend/server/server.go @@ -62,6 +62,7 @@ func Init(db *gorm.DB, integrations integrations.Integrations, settings config.S Auth: &settings.Auth, JWT: jwt, Integrations: integrations, + Calendar: &settings.Calendar, }, } @@ -79,7 +80,7 @@ func allRoutes(app *fiber.App, routeParams types.RouteParams) { pocs.PointOfContact(routeParams) tags.Tag(routeParams) categories.CategoryRoutes(routeParams) - events.Event(routeParams) + events.EventRoutes(routeParams) files.File(routeParams) } diff --git a/backend/tests/domain/recurrence_test.go b/backend/tests/domain/recurrence_test.go new file mode 100644 index 000000000..964a03445 --- /dev/null +++ b/backend/tests/domain/recurrence_test.go @@ -0,0 +1,63 @@ +package tests + +import ( + "testing" + "time" + + "github.com/GenerateNU/sac/backend/protos" +) + +func TestRecurrenceUntil(t *testing.T) { + recurrence, err := protos.NewRecurrence( + protos.Weekly, + protos.Wednesday, + ) + if err != nil { + t.Errorf("unexpected error: %v", err) + } + + start := time.Date(2024, 1, 3, 6, 30, 0, 0, time.UTC) // Wednesday January 3, 2024 6:30 AM + end := time.Date(2024, 1, 3, 9, 0, 0, 0, time.UTC) // Wednesday January 3, 2024 9:00 AM + termination := time.Date(2024, 2, 1, 0, 0, 0, 0, time.UTC) // Thursday February 1, 2024 12:00 AM + + events, err := recurrence.ReccurUntil(start, end, termination) + if err != nil { + t.Errorf("unexpected error: %v", err) + } + + expected := []protos.Occurrence{ + { + Start: start, + End: end, + }, + { + Start: time.Date(2024, 1, 10, 6, 30, 0, 0, time.UTC), + End: time.Date(2024, 1, 10, 9, 0, 0, 0, time.UTC), + }, + { + Start: time.Date(2024, 1, 17, 6, 30, 0, 0, time.UTC), + End: time.Date(2024, 1, 17, 9, 0, 0, 0, time.UTC), + }, + { + Start: time.Date(2024, 1, 24, 6, 30, 0, 0, time.UTC), + End: time.Date(2024, 1, 24, 9, 0, 0, 0, time.UTC), + }, + { + Start: time.Date(2024, 1, 31, 6, 30, 0, 0, time.UTC), + End: time.Date(2024, 1, 31, 9, 0, 0, 0, time.UTC), + }, + } + + if len(events) != len(expected) { + t.Errorf("expected %d events, got %d", len(expected), len(events)) + } + + for i, event := range events { + if event.Start != expected[i].Start { + t.Errorf("expected start time %v, got %v", expected[i].Start, event.Start) + } + if event.End != expected[i].End { + t.Errorf("expected end time %v, got %v", expected[i].End, event.End) + } + } +} diff --git a/backend/types/params.go b/backend/types/params.go index 77c99a167..6f4551524 100644 --- a/backend/types/params.go +++ b/backend/types/params.go @@ -21,5 +21,6 @@ type ServiceParams struct { Validate *validator.Validate Auth *config.AuthSettings JWT auth.JWTClientInterface + Calendar *config.CalendarSettings Integrations integrations.Integrations } diff --git a/backend/utilities/manipulator.go b/backend/utilities/manipulator.go index 36061050f..9d37e0764 100644 --- a/backend/utilities/manipulator.go +++ b/backend/utilities/manipulator.go @@ -1,29 +1,34 @@ package utilities import ( + "fmt" "strings" - "github.com/mitchellh/mapstructure" + "github.com/go-viper/mapstructure/v2" ) -// MapRequestToModel maps request data to a target model using mapstructure -func MapRequestToModel[T any, U any](responseData T, targetModel *U) (*U, error) { +// MapJsonTags maps request data to a target model using mapstructure +// NOTE: this function does not correctly map time.Time fields from from to time.Time fields in intoType +// see the following GitHub issues: +// https://github.com/mitchellh/mapstructure/issues/334 +// https://github.com/go-viper/mapstructure/issues/20 +func MapJsonTags[From any, Into any](from From, intoType *Into) (*Into, error) { config := &mapstructure.DecoderConfig{ - Result: targetModel, + Result: intoType, TagName: "json", } decoder, err := mapstructure.NewDecoder(config) if err != nil { - return nil, err + return nil, fmt.Errorf("failed to create decoder: %w", err) } - err = decoder.Decode(responseData) + err = decoder.Decode(from) if err != nil { - return nil, err + return nil, fmt.Errorf("failed to decode data: %w", err) } - return targetModel, nil + return intoType, nil } func NormalizeEmail(email string) string { diff --git a/cli/cmd/lint.go b/cli/cmd/lint.go index b97d87078..c1115ce4f 100644 --- a/cli/cmd/lint.go +++ b/cli/cmd/lint.go @@ -102,7 +102,7 @@ var lintBackendCmd = &cobra.Command{ os.Exit(1) } - err = helpers.Execute(exec.Command("golangci-lint", "run", "--fix"), helpers.BACKEND_DIR) + err = helpers.Execute(exec.Command("golangci-lint", "run", "--fix", "--timeout=1m"), helpers.BACKEND_DIR) if err != nil { fmt.Println(err) os.Exit(1) @@ -122,7 +122,7 @@ var lintCliCmd = &cobra.Command{ os.Exit(1) } - err = helpers.Execute(exec.Command("golangci-lint", "run", "--fix"), helpers.CLI_DIR) + err = helpers.Execute(exec.Command("golangci-lint", "run", "--fix", "--timeout=1m"), helpers.CLI_DIR) if err != nil { fmt.Println(err) os.Exit(1) diff --git a/config/local.yml b/config/local.yml index 8a88af9b2..2b1afe5fa 100644 --- a/config/local.yml +++ b/config/local.yml @@ -13,4 +13,6 @@ superuser: password: Password#!1 auth: accesskey: g(r|##*?>\Qp}h37e+,T2 - refreshkey: amk*2!gG}1i"8D9RwJS$p \ No newline at end of file + refreshkey: amk*2!gG}1i"8D9RwJS$p +calendar: + maxterminationdate: 12-31-2024 From 3c2d51c06cf96c92e7f41a138628442bc7a57d85 Mon Sep 17 00:00:00 2001 From: Garrett Ladley <92384606+garrettladley@users.noreply.github.com> Date: Fri, 17 May 2024 18:24:56 -0400 Subject: [PATCH 05/28] fix: delete event series & recurrence fixes (#815) --- .../entities/events/series/transactions.go | 3 +- backend/protos/recurrence.go | 24 +---- backend/tests/domain/recurrence_test.go | 90 +++++++++++++------ 3 files changed, 65 insertions(+), 52 deletions(-) diff --git a/backend/entities/events/series/transactions.go b/backend/entities/events/series/transactions.go index 607c21b99..2c4b3c598 100644 --- a/backend/entities/events/series/transactions.go +++ b/backend/entities/events/series/transactions.go @@ -65,10 +65,11 @@ func GetEventSeries(db *gorm.DB, seriesID uuid.UUID) ([]models.Event, error) { } func DeleteEventSeries(db *gorm.DB, seriesID uuid.UUID) error { - if err := db.Where("series_id = ?", seriesID).Delete(&models.Event{}).Error; err != nil { + if err := db.Where("id = ?", seriesID).Delete(&Series{}).Error; err != nil { if errors.Is(err, gorm.ErrRecordNotFound) { return utilities.ErrNotFound } + return err } diff --git a/backend/protos/recurrence.go b/backend/protos/recurrence.go index 75d85b2ea..4543eb156 100644 --- a/backend/protos/recurrence.go +++ b/backend/protos/recurrence.go @@ -148,31 +148,11 @@ func (r *Recurrence) ReccurUntil(start time.Time, end time.Time, termination tim current := start currentEnd := end for current.Before(termination) { - if current.After(currentEnd) { + if current.After(termination) && currentEnd.After(termination) { break } - if r.HappensOnMonday && current.Weekday() == time.Monday { - result = append(result, Occurrence{current, currentEnd}) - } - if r.HappensOnTuesday && current.Weekday() == time.Tuesday { - result = append(result, Occurrence{current, currentEnd}) - } - if r.HappensOnWednesday && current.Weekday() == time.Wednesday { - result = append(result, Occurrence{current, currentEnd}) - } - if r.HappensOnThursday && current.Weekday() == time.Thursday { - result = append(result, Occurrence{current, currentEnd}) - } - if r.HappensOnFriday && current.Weekday() == time.Friday { - result = append(result, Occurrence{current, currentEnd}) - } - if r.HappensOnSaturday && current.Weekday() == time.Saturday { - result = append(result, Occurrence{current, currentEnd}) - } - if r.HappensOnSunday && current.Weekday() == time.Sunday { - result = append(result, Occurrence{current, currentEnd}) - } + result = append(result, Occurrence{current, currentEnd}) current = current.AddDate(0, monthIncrement, dayIncrement) currentEnd = currentEnd.AddDate(0, monthIncrement, dayIncrement) diff --git a/backend/tests/domain/recurrence_test.go b/backend/tests/domain/recurrence_test.go index 964a03445..a5584658e 100644 --- a/backend/tests/domain/recurrence_test.go +++ b/backend/tests/domain/recurrence_test.go @@ -7,45 +7,77 @@ import ( "github.com/GenerateNU/sac/backend/protos" ) -func TestRecurrenceUntil(t *testing.T) { - recurrence, err := protos.NewRecurrence( - protos.Weekly, - protos.Wednesday, - ) +func TestRecurrenceUntilWeekly(t *testing.T) { + t.Parallel() + + recurrence, err := protos.NewRecurrence(protos.Weekly, protos.Wednesday) if err != nil { t.Errorf("unexpected error: %v", err) } - start := time.Date(2024, 1, 3, 6, 30, 0, 0, time.UTC) // Wednesday January 3, 2024 6:30 AM - end := time.Date(2024, 1, 3, 9, 0, 0, 0, time.UTC) // Wednesday January 3, 2024 9:00 AM - termination := time.Date(2024, 2, 1, 0, 0, 0, 0, time.UTC) // Thursday February 1, 2024 12:00 AM + start := time.Date(2024, 1, 3, 6, 30, 0, 0, time.UTC) + end := time.Date(2024, 1, 3, 9, 0, 0, 0, time.UTC) + termination := time.Date(2024, 2, 1, 0, 0, 0, 0, time.UTC) - events, err := recurrence.ReccurUntil(start, end, termination) + expected := []protos.Occurrence{ + {Start: start, End: end}, + {Start: time.Date(2024, 1, 10, 6, 30, 0, 0, time.UTC), End: time.Date(2024, 1, 10, 9, 0, 0, 0, time.UTC)}, + {Start: time.Date(2024, 1, 17, 6, 30, 0, 0, time.UTC), End: time.Date(2024, 1, 17, 9, 0, 0, 0, time.UTC)}, + {Start: time.Date(2024, 1, 24, 6, 30, 0, 0, time.UTC), End: time.Date(2024, 1, 24, 9, 0, 0, 0, time.UTC)}, + {Start: time.Date(2024, 1, 31, 6, 30, 0, 0, time.UTC), End: time.Date(2024, 1, 31, 9, 0, 0, 0, time.UTC)}, + } + + validateOccurrences(t, recurrence, start, end, termination, expected) +} + +func TestRecurrenceUntilBiweekly(t *testing.T) { + t.Parallel() + + recurrence, err := protos.NewRecurrence(protos.Biweekly, protos.Wednesday) if err != nil { t.Errorf("unexpected error: %v", err) } + start := time.Date(2024, 1, 3, 6, 30, 0, 0, time.UTC) + end := time.Date(2024, 1, 3, 9, 0, 0, 0, time.UTC) + termination := time.Date(2024, 3, 1, 0, 0, 0, 0, time.UTC) + expected := []protos.Occurrence{ - { - Start: start, - End: end, - }, - { - Start: time.Date(2024, 1, 10, 6, 30, 0, 0, time.UTC), - End: time.Date(2024, 1, 10, 9, 0, 0, 0, time.UTC), - }, - { - Start: time.Date(2024, 1, 17, 6, 30, 0, 0, time.UTC), - End: time.Date(2024, 1, 17, 9, 0, 0, 0, time.UTC), - }, - { - Start: time.Date(2024, 1, 24, 6, 30, 0, 0, time.UTC), - End: time.Date(2024, 1, 24, 9, 0, 0, 0, time.UTC), - }, - { - Start: time.Date(2024, 1, 31, 6, 30, 0, 0, time.UTC), - End: time.Date(2024, 1, 31, 9, 0, 0, 0, time.UTC), - }, + {Start: start, End: end}, + {Start: time.Date(2024, 1, 17, 6, 30, 0, 0, time.UTC), End: time.Date(2024, 1, 17, 9, 0, 0, 0, time.UTC)}, + {Start: time.Date(2024, 1, 31, 6, 30, 0, 0, time.UTC), End: time.Date(2024, 1, 31, 9, 0, 0, 0, time.UTC)}, + {Start: time.Date(2024, 2, 14, 6, 30, 0, 0, time.UTC), End: time.Date(2024, 2, 14, 9, 0, 0, 0, time.UTC)}, + {Start: time.Date(2024, 2, 28, 6, 30, 0, 0, time.UTC), End: time.Date(2024, 2, 28, 9, 0, 0, 0, time.UTC)}, + } + + validateOccurrences(t, recurrence, start, end, termination, expected) +} + +func TestRecurrenceUntilMonthly(t *testing.T) { + t.Parallel() + + recurrence, err := protos.NewRecurrence(protos.Monthly, protos.Wednesday) + if err != nil { + t.Errorf("unexpected error: %v", err) + } + + start := time.Date(2024, 1, 3, 6, 30, 0, 0, time.UTC) + end := time.Date(2024, 1, 3, 9, 0, 0, 0, time.UTC) + termination := time.Date(2024, 4, 1, 0, 0, 0, 0, time.UTC) + + expected := []protos.Occurrence{ + {Start: start, End: end}, + {Start: time.Date(2024, 2, 3, 6, 30, 0, 0, time.UTC), End: time.Date(2024, 2, 3, 9, 0, 0, 0, time.UTC)}, + {Start: time.Date(2024, 3, 3, 6, 30, 0, 0, time.UTC), End: time.Date(2024, 3, 3, 9, 0, 0, 0, time.UTC)}, + } + + validateOccurrences(t, recurrence, start, end, termination, expected) +} + +func validateOccurrences(t *testing.T, recurrence *protos.Recurrence, start, end, termination time.Time, expected []protos.Occurrence) { + events, err := recurrence.ReccurUntil(start, end, termination) + if err != nil { + t.Errorf("unexpected error: %v", err) } if len(events) != len(expected) { From 60be18d3044f1bd4a0d8c579c0af6649cd5cdd7c Mon Sep 17 00:00:00 2001 From: Garrett Ladley <92384606+garrettladley@users.noreply.github.com> Date: Fri, 17 May 2024 18:30:27 -0400 Subject: [PATCH 06/28] revamp transactions based off gorm docs (#816) --- backend/database/db.go | 7 +++- backend/entities/clubs/base/transactions.go | 40 ++++++++++--------- backend/entities/clubs/member/transactions.go | 22 +++++----- backend/entities/tags/base/transactions.go | 12 +++--- 4 files changed, 46 insertions(+), 35 deletions(-) diff --git a/backend/database/db.go b/backend/database/db.go index 1dc5f181a..c2652aefa 100644 --- a/backend/database/db.go +++ b/backend/database/db.go @@ -82,6 +82,11 @@ func CreateSuperUserIfNotExists(settings config.Settings, db *gorm.DB) error { func createSuperUser(settings config.Settings, db *gorm.DB) error { tx := db.Begin() + defer func() { + if r := recover(); r != nil { + tx.Rollback() + } + }() if err := tx.Error; err != nil { return err @@ -144,5 +149,5 @@ func createSuperUser(settings config.Settings, db *gorm.DB) error { return tx.Commit().Error } - return nil + return tx.Commit().Error } diff --git a/backend/entities/clubs/base/transactions.go b/backend/entities/clubs/base/transactions.go index d69b9e8b5..145236539 100644 --- a/backend/entities/clubs/base/transactions.go +++ b/backend/entities/clubs/base/transactions.go @@ -86,6 +86,15 @@ func CreateClub(db *gorm.DB, pinecone search.SearchClientInterface, userId uuid. } tx := db.Begin() + defer func() { + if r := recover(); r != nil { + tx.Rollback() + } + }() + + if err := tx.Error; err != nil { + return nil, err + } club.NumMembers = 1 @@ -115,16 +124,16 @@ func CreateClub(db *gorm.DB, pinecone search.SearchClientInterface, userId uuid. return nil, err } - if err := tx.Commit().Error; err != nil { - tx.Rollback() - return nil, err - } - - return &club, nil + return &club, tx.Commit().Error } func UpdateClub(db *gorm.DB, pinecone search.SearchClientInterface, id uuid.UUID, club models.Club) (*models.Club, error) { tx := db.Begin() + defer func() { + if r := recover(); r != nil { + tx.Rollback() + } + }() var existingClub models.Club @@ -147,16 +156,16 @@ func UpdateClub(db *gorm.DB, pinecone search.SearchClientInterface, id uuid.UUID return nil, err } - if err := tx.Commit().Error; err != nil { - tx.Rollback() - return nil, err - } - - return &existingClub, nil + return &existingClub, tx.Commit().Error } func DeleteClub(db *gorm.DB, pinecone search.SearchClientInterface, id uuid.UUID) error { tx := db.Begin() + defer func() { + if r := recover(); r != nil { + tx.Rollback() + } + }() var existingClub models.Club err := tx.First(&existingClub, id).Error @@ -181,10 +190,5 @@ func DeleteClub(db *gorm.DB, pinecone search.SearchClientInterface, id uuid.UUID return result.Error } - if err := tx.Commit().Error; err != nil { - tx.Rollback() - return err - } - - return nil + return tx.Commit().Error } diff --git a/backend/entities/clubs/member/transactions.go b/backend/entities/clubs/member/transactions.go index 884730470..d2987f069 100644 --- a/backend/entities/clubs/member/transactions.go +++ b/backend/entities/clubs/member/transactions.go @@ -38,6 +38,11 @@ func CreateClubMember(db *gorm.DB, clubID uuid.UUID, userID uuid.UUID) error { } tx := db.Begin() + defer func() { + if r := recover(); r != nil { + tx.Rollback() + } + }() var count int64 if err := tx.Model(&models.Membership{}).Where("user_id = ? AND club_id = ?", userID, clubID).Count(&count).Error; err != nil { @@ -63,11 +68,7 @@ func CreateClubMember(db *gorm.DB, clubID uuid.UUID, userID uuid.UUID) error { return err } - if err := tx.Commit().Error; err != nil { - return err - } - - return nil + return tx.Commit().Error } func DeleteClubMember(db *gorm.DB, clubID uuid.UUID, userID uuid.UUID) error { @@ -82,6 +83,11 @@ func DeleteClubMember(db *gorm.DB, clubID uuid.UUID, userID uuid.UUID) error { } tx := db.Begin() + defer func() { + if r := recover(); r != nil { + tx.Rollback() + } + }() if err := tx.Model(&user).Association("Member").Delete(club); err != nil { tx.Rollback() @@ -98,9 +104,5 @@ func DeleteClubMember(db *gorm.DB, clubID uuid.UUID, userID uuid.UUID) error { return err } - if err := tx.Commit().Error; err != nil { - return err - } - - return nil + return tx.Commit().Error } diff --git a/backend/entities/tags/base/transactions.go b/backend/entities/tags/base/transactions.go index f6535957c..fd55f1c8d 100644 --- a/backend/entities/tags/base/transactions.go +++ b/backend/entities/tags/base/transactions.go @@ -14,6 +14,11 @@ import ( func CreateTag(db *gorm.DB, tag models.Tag) (*models.Tag, error) { tx := db.Begin() + defer func() { + if r := recover(); r != nil { + tx.Rollback() + } + }() var category models.Category if err := tx.Where("id = ?", tag.CategoryID).First(&category).Error; err != nil { @@ -31,12 +36,7 @@ func CreateTag(db *gorm.DB, tag models.Tag) (*models.Tag, error) { return nil, err } - if err := tx.Commit().Error; err != nil { - tx.Rollback() - return nil, err - } - - return &tag, nil + return &tag, tx.Commit().Error } func GetTags(db *gorm.DB) ([]models.Tag, error) { From e30286c91c5f7649515aa3c58971048088359775 Mon Sep 17 00:00:00 2001 From: Garrett Ladley <92384606+garrettladley@users.noreply.github.com> Date: Fri, 17 May 2024 18:37:26 -0400 Subject: [PATCH 07/28] fix: update db transactions to use `Clauses(clause.Returning{})` (#817) --- backend/entities/categories/base/transactions.go | 6 ++++-- backend/entities/clubs/base/transactions.go | 4 ++-- backend/entities/clubs/poc/transactions.go | 4 ++-- backend/entities/tags/base/transactions.go | 6 ++++-- backend/entities/users/base/transactions.go | 3 ++- 5 files changed, 14 insertions(+), 9 deletions(-) diff --git a/backend/entities/categories/base/transactions.go b/backend/entities/categories/base/transactions.go index 532da09ea..6e981f10e 100644 --- a/backend/entities/categories/base/transactions.go +++ b/backend/entities/categories/base/transactions.go @@ -10,6 +10,7 @@ import ( "github.com/GenerateNU/sac/backend/entities/models" "gorm.io/gorm" + "gorm.io/gorm/clause" ) func CreateCategory(db *gorm.DB, category models.Category) (*models.Category, error) { @@ -47,14 +48,15 @@ func GetCategory(db *gorm.DB, id uuid.UUID) (*models.Category, error) { } func UpdateCategory(db *gorm.DB, id uuid.UUID, category models.Category) (*models.Category, error) { - if err := db.Model(&models.Category{}).Where("id = ?", id).Updates(category).First(&category, id).Error; err != nil { + var resultingCategory models.Category + if err := db.Model(&resultingCategory).Clauses(clause.Returning{}).Where("id = ?", id).Updates(category).First(&category, id).Error; err != nil { if errors.Is(err, gorm.ErrRecordNotFound) { return nil, utilities.ErrNotFound } return nil, err } - return &category, nil + return &resultingCategory, nil } func DeleteCategory(db *gorm.DB, id uuid.UUID) error { diff --git a/backend/entities/clubs/base/transactions.go b/backend/entities/clubs/base/transactions.go index 145236539..c1352a5b8 100644 --- a/backend/entities/clubs/base/transactions.go +++ b/backend/entities/clubs/base/transactions.go @@ -13,6 +13,7 @@ import ( "github.com/google/uuid" "gorm.io/gorm" + "gorm.io/gorm/clause" ) func GetClubs(db *gorm.DB, pinecone search.SearchClientInterface, queryParams *models.ClubQueryParams, pageInfo fiberpaginate.PageInfo) ([]models.Club, error) { @@ -136,7 +137,6 @@ func UpdateClub(db *gorm.DB, pinecone search.SearchClientInterface, id uuid.UUID }() var existingClub models.Club - err := tx.First(&existingClub, id).Error if err != nil { tx.Rollback() @@ -146,7 +146,7 @@ func UpdateClub(db *gorm.DB, pinecone search.SearchClientInterface, id uuid.UUID return nil, err } - if err := tx.Model(&existingClub).Updates(&club).Error; err != nil { + if err := tx.Model(&existingClub).Clauses(clause.Returning{}).Updates(&club).Error; err != nil { tx.Rollback() return nil, err } diff --git a/backend/entities/clubs/poc/transactions.go b/backend/entities/clubs/poc/transactions.go index b6e64268a..e1dfb4ac8 100644 --- a/backend/entities/clubs/poc/transactions.go +++ b/backend/entities/clubs/poc/transactions.go @@ -8,6 +8,7 @@ import ( "github.com/GenerateNU/sac/backend/utilities" "github.com/google/uuid" "gorm.io/gorm" + "gorm.io/gorm/clause" ) func GetClubPointOfContacts(db *gorm.DB, clubID uuid.UUID) ([]models.PointOfContact, error) { @@ -69,8 +70,7 @@ func UpdateClubPointOfContact(db *gorm.DB, clubID uuid.UUID, pocID uuid.UUID, po if err != nil { return nil, err } - - if err := db.Model(&pointOfContact).Updates(models.PointOfContact{ + if err := db.Model(&pointOfContact).Clauses(clause.Returning{}).Updates(models.PointOfContact{ Name: pointOfContactBody.Name, Email: pointOfContactBody.Email, Position: pointOfContactBody.Position, diff --git a/backend/entities/tags/base/transactions.go b/backend/entities/tags/base/transactions.go index fd55f1c8d..b1aa2cd76 100644 --- a/backend/entities/tags/base/transactions.go +++ b/backend/entities/tags/base/transactions.go @@ -10,6 +10,7 @@ import ( "github.com/GenerateNU/sac/backend/entities/tags" "gorm.io/gorm" + "gorm.io/gorm/clause" ) func CreateTag(db *gorm.DB, tag models.Tag) (*models.Tag, error) { @@ -50,14 +51,15 @@ func GetTags(db *gorm.DB) ([]models.Tag, error) { } func UpdateTag(db *gorm.DB, id uuid.UUID, tag models.Tag) (*models.Tag, error) { - if err := db.Model(&models.Tag{}).Where("id = ?", id).Updates(tag).First(&tag, id).Error; err != nil { + var resultingTag models.Tag + if err := db.Model(&resultingTag).Clauses(clause.Returning{}).Where("id = ?", id).Updates(tag).First(&tag, id).Error; err != nil { if errors.Is(err, gorm.ErrRecordNotFound) { return nil, utilities.ErrNotFound } return nil, err } - return &tag, nil + return &resultingTag, nil } func DeleteTag(db *gorm.DB, tagID uuid.UUID) error { diff --git a/backend/entities/users/base/transactions.go b/backend/entities/users/base/transactions.go index 7cc2a7e58..e3acaf1bb 100644 --- a/backend/entities/users/base/transactions.go +++ b/backend/entities/users/base/transactions.go @@ -10,6 +10,7 @@ import ( "github.com/google/uuid" "gorm.io/gorm" + "gorm.io/gorm/clause" ) func GetUsers(db *gorm.DB, pageInfo fiberpaginate.PageInfo) ([]models.User, error) { @@ -44,7 +45,7 @@ func UpdateUser(db *gorm.DB, id uuid.UUID, user models.User) (*models.User, erro return nil, err } - if err := db.Model(&existingUser).Updates(&user).Error; err != nil { + if err := db.Model(&existingUser).Clauses(clause.Returning{}).Updates(&user).Error; err != nil { return nil, err } From 10b651311ead267504011887954747775ac3374a Mon Sep 17 00:00:00 2001 From: Garrett Ladley <92384606+garrettladley@users.noreply.github.com> Date: Fri, 17 May 2024 18:45:54 -0400 Subject: [PATCH 08/28] db: timestamps WITH timezones (#818) --- backend/migrations/000001_init.up.sql | 46 +++++++++++++-------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/backend/migrations/000001_init.up.sql b/backend/migrations/000001_init.up.sql index 16cf627f0..1da905aa0 100644 --- a/backend/migrations/000001_init.up.sql +++ b/backend/migrations/000001_init.up.sql @@ -4,8 +4,8 @@ CREATE EXTENSION IF NOT EXISTS "uuid-ossp"; CREATE TABLE IF NOT EXISTS users( id uuid NOT NULL DEFAULT uuid_generate_v4(), - created_at timestamp without time zone NOT NULL DEFAULT CURRENT_TIMESTAMP, - updated_at timestamp without time zone NOT NULL DEFAULT CURRENT_TIMESTAMP, + created_at timestamp with time zone NOT NULL DEFAULT CURRENT_TIMESTAMP, + updated_at timestamp with time zone NOT NULL DEFAULT CURRENT_TIMESTAMP, role varchar(255) NOT NULL DEFAULT 'student'::character varying, first_name varchar(255) NOT NULL, last_name varchar(255) NOT NULL, @@ -23,8 +23,8 @@ CREATE TABLE IF NOT EXISTS users( CREATE TABLE IF NOT EXISTS clubs( id uuid NOT NULL DEFAULT uuid_generate_v4(), - created_at timestamp without time zone NOT NULL DEFAULT CURRENT_TIMESTAMP, - updated_at timestamp without time zone NOT NULL DEFAULT CURRENT_TIMESTAMP, + created_at timestamp with time zone NOT NULL DEFAULT CURRENT_TIMESTAMP, + updated_at timestamp with time zone NOT NULL DEFAULT CURRENT_TIMESTAMP, soft_deleted_at timestamp with time zone, name varchar(255) NOT NULL, preview varchar(255) NOT NULL, @@ -43,15 +43,15 @@ CREATE TABLE IF NOT EXISTS clubs( CREATE TABLE IF NOT EXISTS series( id uuid NOT NULL DEFAULT uuid_generate_v4(), - created_at timestamp without time zone NOT NULL DEFAULT CURRENT_TIMESTAMP, - updated_at timestamp without time zone NOT NULL DEFAULT CURRENT_TIMESTAMP, + created_at timestamp with time zone NOT NULL DEFAULT CURRENT_TIMESTAMP, + updated_at timestamp with time zone NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY(id) ); CREATE TABLE IF NOT EXISTS events( id uuid NOT NULL DEFAULT uuid_generate_v4(), - created_at timestamp without time zone NOT NULL DEFAULT CURRENT_TIMESTAMP, - updated_at timestamp without time zone NOT NULL DEFAULT CURRENT_TIMESTAMP, + created_at timestamp with time zone NOT NULL DEFAULT CURRENT_TIMESTAMP, + updated_at timestamp with time zone NOT NULL DEFAULT CURRENT_TIMESTAMP, name varchar(255) NOT NULL, preview varchar(255) NOT NULL, description varchar(255) NOT NULL, @@ -61,8 +61,8 @@ CREATE TABLE IF NOT EXISTS events( is_public boolean NOT NULL, is_draft boolean NOT NULL, is_archived boolean NOT NULL, - start_time timestamp without time zone NOT NULL, - end_time timestamp without time zone NOT NULL, + start_time timestamp with time zone NOT NULL, + end_time timestamp with time zone NOT NULL, host uuid NOT NULL, series_id uuid, PRIMARY KEY(id), @@ -72,8 +72,8 @@ CREATE TABLE IF NOT EXISTS events( CREATE TABLE IF NOT EXISTS categories( id uuid NOT NULL DEFAULT uuid_generate_v4(), - created_at timestamp without time zone NOT NULL DEFAULT CURRENT_TIMESTAMP, - updated_at timestamp without time zone NOT NULL DEFAULT CURRENT_TIMESTAMP, + created_at timestamp with time zone NOT NULL DEFAULT CURRENT_TIMESTAMP, + updated_at timestamp with time zone NOT NULL DEFAULT CURRENT_TIMESTAMP, name varchar(255) NOT NULL, PRIMARY KEY(id) ); @@ -83,8 +83,8 @@ CREATE UNIQUE INDEX IF NOT EXISTS uni_categories_name ON categories USING btree CREATE TABLE IF NOT EXISTS tags( id uuid NOT NULL DEFAULT uuid_generate_v4(), - created_at timestamp without time zone NOT NULL DEFAULT CURRENT_TIMESTAMP, - updated_at timestamp without time zone NOT NULL DEFAULT CURRENT_TIMESTAMP, + created_at timestamp with time zone NOT NULL DEFAULT CURRENT_TIMESTAMP, + updated_at timestamp with time zone NOT NULL DEFAULT CURRENT_TIMESTAMP, name varchar(255) NOT NULL, category_id uuid NOT NULL, PRIMARY KEY(id), @@ -109,8 +109,8 @@ CREATE TABLE IF NOT EXISTS club_tags( CREATE TABLE IF NOT EXISTS contacts( id uuid NOT NULL DEFAULT uuid_generate_v4(), - created_at timestamp without time zone NOT NULL DEFAULT CURRENT_TIMESTAMP, - updated_at timestamp without time zone NOT NULL DEFAULT CURRENT_TIMESTAMP, + created_at timestamp with time zone NOT NULL DEFAULT CURRENT_TIMESTAMP, + updated_at timestamp with time zone NOT NULL DEFAULT CURRENT_TIMESTAMP, "type" varchar(255) NOT NULL, content varchar(255) NOT NULL, club_id uuid NOT NULL, @@ -130,8 +130,8 @@ CREATE TABLE IF NOT EXISTS event_tags( CREATE TABLE IF NOT EXISTS files( id uuid NOT NULL DEFAULT uuid_generate_v4(), - created_at timestamp without time zone NOT NULL DEFAULT CURRENT_TIMESTAMP, - updated_at timestamp without time zone NOT NULL DEFAULT CURRENT_TIMESTAMP, + created_at timestamp with time zone NOT NULL DEFAULT CURRENT_TIMESTAMP, + updated_at timestamp with time zone NOT NULL DEFAULT CURRENT_TIMESTAMP, owner_id uuid NOT NULL, owner_type varchar(255) NOT NULL, file_name varchar(255) NOT NULL, @@ -146,8 +146,8 @@ CREATE INDEX IF NOT EXISTS idx_files_owner_id ON files USING btree ("owner_id"); -- CREATE TABLE IF NOT EXISTS notifications( -- id uuid NOT NULL DEFAULT uuid_generate_v4(), --- created_at timestamp without time zone NOT NULL DEFAULT CURRENT_TIMESTAMP, --- updated_at timestamp without time zone NOT NULL DEFAULT CURRENT_TIMESTAMP, +-- created_at timestamp with time zone NOT NULL DEFAULT CURRENT_TIMESTAMP, +-- updated_at timestamp with time zone NOT NULL DEFAULT CURRENT_TIMESTAMP, -- send_at timestamp with time zone NOT NULL, -- title varchar(255) NOT NULL, -- content varchar(255) NOT NULL, @@ -160,8 +160,8 @@ CREATE INDEX IF NOT EXISTS idx_files_owner_id ON files USING btree ("owner_id"); CREATE TABLE IF NOT EXISTS point_of_contacts( id uuid NOT NULL DEFAULT uuid_generate_v4(), - created_at timestamp without time zone NOT NULL DEFAULT CURRENT_TIMESTAMP, - updated_at timestamp without time zone NOT NULL DEFAULT CURRENT_TIMESTAMP, + created_at timestamp with time zone NOT NULL DEFAULT CURRENT_TIMESTAMP, + updated_at timestamp with time zone NOT NULL DEFAULT CURRENT_TIMESTAMP, name varchar(255) NOT NULL, email varchar(255) NOT NULL, position varchar(255) NOT NULL, @@ -228,7 +228,7 @@ CREATE UNIQUE INDEX IF NOT EXISTS uni_users_email ON users USING btree ("email") CREATE TABLE IF NOT EXISTS verifications( user_id uuid NOT NULL, token varchar(255), - expires_at timestamp without time zone NOT NULL, + expires_at timestamp with time zone NOT NULL, "type" varchar(255) NOT NULL, PRIMARY KEY(user_id,expires_at) ); From f8f0df43f8a29c88c41039acb047d90879e3632b Mon Sep 17 00:00:00 2001 From: Garrett Ladley <92384606+garrettladley@users.noreply.github.com> Date: Fri, 17 May 2024 18:48:19 -0400 Subject: [PATCH 09/28] fix: remove outdated comments (#819) --- backend/entities/models/event.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/entities/models/event.go b/backend/entities/models/event.go index a2e23dc9d..4d030ee7a 100644 --- a/backend/entities/models/event.go +++ b/backend/entities/models/event.go @@ -53,7 +53,7 @@ type CreateEventRequestBody struct { Name string `json:"name" validate:"required,max=255"` Preview string `json:"preview" validate:"required,max=255"` Description string `json:"description" validate:"required,max=255"` - HostID uuid.UUID `json:"host" validate:"uuid4"` // TODO ensure you are an admin of the host + HostID uuid.UUID `json:"host" validate:"uuid4"` // geoshi EventType EventType `json:"event_type" validate:"required,max=255,oneof=hybrid in_person virtual"` @@ -62,7 +62,7 @@ type CreateEventRequestBody struct { // internal housekeeping states IsPublic *bool `json:"is_public" validate:"required"` - IsDraft *bool `json:"is_draft" validate:"required"` // some logic here. drafts shouldn't be public + IsDraft *bool `json:"is_draft" validate:"required"` IsArchived *bool `json:"is_archived" validate:"required"` // timing From 06dace1b0866124186c25ff643bcc47e2dbe7a5d Mon Sep 17 00:00:00 2001 From: Garrett Ladley <92384606+garrettladley@users.noreply.github.com> Date: Fri, 17 May 2024 18:55:40 -0400 Subject: [PATCH 10/28] fix: validate struct tags not required on core models (#820) --- backend/entities/models/category.go | 4 +- backend/entities/models/club.go | 52 ++++++++++++------------- backend/entities/models/comment.go | 18 ++++----- backend/entities/models/contact.go | 6 +-- backend/entities/models/event.go | 36 ++++++++--------- backend/entities/models/file.go | 14 +++---- backend/entities/models/follower.go | 8 ++-- backend/entities/models/membership.go | 10 ++--- backend/entities/models/notification.go | 14 +++---- backend/entities/models/poc.go | 8 ++-- backend/entities/models/tag.go | 10 ++--- backend/entities/models/user.go | 40 +++++++++---------- backend/entities/models/verification.go | 8 ++-- 13 files changed, 114 insertions(+), 114 deletions(-) diff --git a/backend/entities/models/category.go b/backend/entities/models/category.go index f4a15da46..6690df93d 100644 --- a/backend/entities/models/category.go +++ b/backend/entities/models/category.go @@ -3,8 +3,8 @@ package models type Category struct { Model - Name string `json:"name" validate:"required,max=255"` - Tag []Tag `json:"-" validate:"-"` + Name string `json:"name"` + Tag []Tag `json:"-"` } type CategoryRequestBody struct { diff --git a/backend/entities/models/club.go b/backend/entities/models/club.go index d8094b266..537ac3746 100644 --- a/backend/entities/models/club.go +++ b/backend/entities/models/club.go @@ -28,37 +28,37 @@ const ( type Club struct { Model - SoftDeletedAt gorm.DeletedAt `json:"-" validate:"-"` - - Name string `json:"name" validate:"required,max=255"` - Preview string `json:"preview" validate:"required,max=255"` - Description string `json:"description" validate:"required,http_url,s3_url,max=255"` - NumMembers int `json:"num_members" validate:"required,min=1"` - IsRecruiting bool `json:"is_recruiting" validate:"required"` - RecruitmentCycle RecruitmentCycle `json:"recruitment_cycle" validate:"required,max=255,oneof=fall spring fallSpring always"` - RecruitmentType RecruitmentType `json:"recruitment_type" validate:"required,max=255,oneof=unrestricted tryout application"` - WeeklyTimeCommitment int `json:"weekly_time_commitment" validate:"omitempty,min=1"` - OneWordToDescribeUs string `json:"one_word_to_describe_us" validate:"omitempty,max=255"` - ApplicationLink string `json:"application_link" validate:"required,max=255,http_url"` - Logo string `json:"logo" validate:"omitempty,http_url,s3_url,max=255"` - - Parent *uuid.UUID `gorm:"foreignKey:Parent;" json:"-" validate:"uuid4"` - Tag []Tag `gorm:"many2many:club_tags;" json:"-" validate:"-"` - Member []User `gorm:"many2many:user_club_members;" json:"-" validate:"required"` - Follower []User `gorm:"many2many:user_club_followers;" json:"-" validate:"-"` - IntendedApplicant []User `gorm:"many2many:user_club_intended_applicants;" json:"-" validate:"-"` - Comment []Comment `json:"-" validate:"-"` - PointOfContact []PointOfContact `json:"-" validate:"-"` - Contact []Contact `json:"-" validate:"-"` + SoftDeletedAt gorm.DeletedAt `json:"-"` + + Name string `json:"name"` + Preview string `json:"preview"` + Description string `json:"description"` + NumMembers int `json:"num_members"` + IsRecruiting bool `json:"is_recruiting"` + RecruitmentCycle RecruitmentCycle `json:"recruitment_cycle"` + RecruitmentType RecruitmentType `json:"recruitment_type"` + WeeklyTimeCommitment int `json:"weekly_time_commitment"` + OneWordToDescribeUs string `json:"one_word_to_describe_us"` + ApplicationLink string `json:"application_link"` + Logo string `json:"logo"` + + Parent *uuid.UUID `gorm:"foreignKey:Parent;" json:"-"` + Tag []Tag `gorm:"many2many:club_tags;" json:"-"` + Member []User `gorm:"many2many:user_club_members;" json:"-"` + Follower []User `gorm:"many2many:user_club_followers;" json:"-"` + IntendedApplicant []User `gorm:"many2many:user_club_intended_applicants;" json:"-"` + Comment []Comment `json:"-"` + PointOfContact []PointOfContact `json:"-"` + Contact []Contact `json:"-"` // Event - HostEvent []Event `gorm:"foreignKey:Host;" json:"-" validate:"-"` - Event []Event `gorm:"many2many:club_events;" json:"-" validate:"-"` - Notifcation []Notification `gorm:"polymorphic:Reference;" json:"-" validate:"-"` + HostEvent []Event `gorm:"foreignKey:Host;" json:"-"` + Event []Event `gorm:"many2many:club_events;" json:"-"` + Notifcation []Notification `gorm:"polymorphic:Reference;" json:"-"` } type CreateClubRequestBody struct { - UserID uuid.UUID `json:"user_id" validate:"required,uuid4"` // TODO: huh? + UserID uuid.UUID `json:"user_id" validate:"required,uuid4"` Name string `json:"name" validate:"required,max=255"` Preview string `json:"preview" validate:"required,max=255"` Description string `json:"description" validate:"required,http_url,s3_url,max=255"` diff --git a/backend/entities/models/comment.go b/backend/entities/models/comment.go index 00f73e552..fde2fa825 100644 --- a/backend/entities/models/comment.go +++ b/backend/entities/models/comment.go @@ -5,16 +5,16 @@ import "github.com/google/uuid" type Comment struct { Model - Question string `json:"question" validate:"required,max=255"` - Answer string `json:"answer" validate:",max=255"` - NumFoundHelpful uint `json:"num_found_helpful" validate:"min=0"` + Question string `json:"question"` + Answer string `json:"answer"` + NumFoundHelpful uint `json:"num_found_helpful"` - AskedByID uuid.UUID `json:"-" validate:"uuid4"` - AskedBy User `json:"-" validate:"-"` + AskedByID uuid.UUID `json:"-"` + AskedBy User `json:"-"` - ClubID uuid.UUID `json:"-" validate:"uuid4"` - Club Club `json:"-" validate:"-"` + ClubID uuid.UUID `json:"-"` + Club Club `json:"-"` - AnsweredByID *uuid.UUID `json:"-" validate:"uuid4"` - AnsweredBy *User `json:"-" validate:"-"` + AnsweredByID *uuid.UUID `json:"-"` + AnsweredBy *User `json:"-"` } diff --git a/backend/entities/models/contact.go b/backend/entities/models/contact.go index cf17c5f6f..8b17d95fc 100644 --- a/backend/entities/models/contact.go +++ b/backend/entities/models/contact.go @@ -43,10 +43,10 @@ func GetContentPrefix(contactType ContactType) string { type Contact struct { Model - Type ContactType `json:"type" validate:"required,max=255,oneof=facebook instagram x linkedin youtube github slack discord email customSite"` - Content string `json:"content" validate:"required,max=255"` + Type ContactType `json:"type"` + Content string `json:"content"` - ClubID uuid.UUID `json:"-" validate:"uuid4"` + ClubID uuid.UUID `json:"-"` } type PutContactRequestBody struct { diff --git a/backend/entities/models/event.go b/backend/entities/models/event.go index 4d030ee7a..41a58af35 100644 --- a/backend/entities/models/event.go +++ b/backend/entities/models/event.go @@ -18,34 +18,34 @@ type Event struct { Model // details - Name string `json:"name" validate:"required,max=255"` - Preview string `json:"preview" validate:"required,max=255"` - Description string `json:"description" validate:"required,max=255"` - Host *uuid.UUID `json:"host" validate:"uuid4"` + Name string `json:"name"` + Preview string `json:"preview"` + Description string `json:"description"` + Host *uuid.UUID `json:"host"` // geoshi - EventType EventType `json:"event_type" validate:"required,max=255,oneof=hybrid in_person virtual"` - Location string `json:"location" validate:"max=255,required_if=EventType in_person,required_if=EventType hybrid"` - Link string `json:"link" validate:"url,max=255,required_if=EventType virtual,required_if=EventType hybrid"` + EventType EventType `json:"event_type"` + Location string `json:"location"` + Link string `json:"link"` // internal housekeeping states - IsPublic bool `json:"is_public" validate:"required"` - IsDraft bool `json:"is_draft" validate:"required"` - IsArchived bool `json:"is_archived" validate:"required"` + IsPublic bool `json:"is_public"` + IsDraft bool `json:"is_draft"` + IsArchived bool `json:"is_archived"` // timing - StartTime time.Time `json:"start_time" validate:"required,ltefield=EndTime"` - EndTime time.Time `json:"end_time" validate:"required,gtefield=StartTime"` + StartTime time.Time `json:"start_time"` + EndTime time.Time `json:"end_time"` // series - SeriesID *uuid.UUID `json:"-" validate:"-"` + SeriesID *uuid.UUID `json:"-"` // bridgerton - RSVP []User `gorm:"many2many:user_event_rsvps;" json:"-" validate:"-"` - Waitlist []User `gorm:"many2many:user_event_waitlists;" json:"-" validate:"-"` - Clubs []Club `gorm:"many2many:club_events;" json:"-" validate:"-"` - Tag []Tag `gorm:"many2many:event_tags;" json:"-" validate:"-"` - Notification []Notification `gorm:"polymorphic:Reference;" json:"-" validate:"-"` + RSVP []User `gorm:"many2many:user_event_rsvps;" json:"-"` + Waitlist []User `gorm:"many2many:user_event_waitlists;" json:"-"` + Clubs []Club `gorm:"many2many:club_events;" json:"-"` + Tag []Tag `gorm:"many2many:event_tags;" json:"-"` + Notification []Notification `gorm:"polymorphic:Reference;" json:"-"` } type CreateEventRequestBody struct { diff --git a/backend/entities/models/file.go b/backend/entities/models/file.go index a5ea52b43..6f5ca95e8 100644 --- a/backend/entities/models/file.go +++ b/backend/entities/models/file.go @@ -15,14 +15,14 @@ type FileInfo struct { type File struct { Model - OwnerID uuid.UUID `json:"-" validate:"required,uuid4"` - OwnerType string `json:"-" validate:"required,max=255"` + OwnerID uuid.UUID `json:"-"` + OwnerType string `json:"-"` - FileName string `json:"file_name" validate:"required,max=255"` - FileType string `json:"file_type" validate:"required,max=255"` - FileSize int `json:"file_size" validate:"required,min=1"` - FileURL string `json:"file_url" validate:"required,max=255"` - ObjectKey string `json:"object_key" validate:"required,max=255"` + FileName string `json:"file_name"` + FileType string `json:"file_type"` + FileSize int `json:"file_size"` + FileURL string `json:"file_url"` + ObjectKey string `json:"object_key"` } type CreateFileRequestBody struct { diff --git a/backend/entities/models/follower.go b/backend/entities/models/follower.go index 9d9f015ca..de469eac1 100644 --- a/backend/entities/models/follower.go +++ b/backend/entities/models/follower.go @@ -9,9 +9,9 @@ func (Follower) TableName() string { } type Follower struct { - UserID uuid.UUID `gorm:"primaryKey;" json:"user_id" validate:"required,uuid4"` - ClubID uuid.UUID `gorm:"primaryKey" json:"club_id" validate:"required,uuid4"` + UserID uuid.UUID `gorm:"primaryKey;" json:"user_id"` + ClubID uuid.UUID `gorm:"primaryKey" json:"club_id"` - Club *Club `json:"-" validate:"-"` - User *User `json:"-" validate:"-"` + Club *Club `json:"-"` + User *User `json:"-"` } diff --git a/backend/entities/models/membership.go b/backend/entities/models/membership.go index a4a963911..48c6f79d1 100644 --- a/backend/entities/models/membership.go +++ b/backend/entities/models/membership.go @@ -16,11 +16,11 @@ func (Membership) TableName() string { } type Membership struct { - UserID uuid.UUID `gorm:"primaryKey;" json:"user_id" validate:"required,uuid4"` - ClubID uuid.UUID `gorm:"primaryKey;" json:"club_id" validate:"required,uuid4"` + UserID uuid.UUID `gorm:"primaryKey;" json:"user_id"` + ClubID uuid.UUID `gorm:"primaryKey;" json:"club_id"` - Club *Club `json:"-" validate:"-"` - User *User `json:"-" validate:"-"` + Club *Club `json:"-"` + User *User `json:"-"` - MembershipType MembershipType `json:"membership_type" validate:"required,oneof=member admin"` + MembershipType MembershipType `json:"membership_type"` } diff --git a/backend/entities/models/notification.go b/backend/entities/models/notification.go index 1e1dda738..2c6af0c25 100644 --- a/backend/entities/models/notification.go +++ b/backend/entities/models/notification.go @@ -16,12 +16,12 @@ const ( type Notification struct { Model - SendAt time.Time `json:"send_at" validate:"required"` - Title string `json:"title" validate:"required,max=255"` - Content string `json:"content" validate:"required,max=255"` - DeepLink string `json:"deep_link" validate:"required,max=255"` - Icon string `json:"icon" validate:"required,s3_url,http_url,max=255"` + SendAt time.Time `json:"send_at"` + Title string `json:"title"` + Content string `json:"content"` + DeepLink string `json:"deep_link"` + Icon string `json:"icon"` - ReferenceID uuid.UUID `json:"-" validate:"uuid4"` - ReferenceType NotificationType `json:"-" validate:"max=255"` + ReferenceID uuid.UUID `json:"-"` + ReferenceType NotificationType `json:"-"` } diff --git a/backend/entities/models/poc.go b/backend/entities/models/poc.go index ee03c015b..732cdb01e 100644 --- a/backend/entities/models/poc.go +++ b/backend/entities/models/poc.go @@ -7,11 +7,11 @@ import ( type PointOfContact struct { Model - Name string `json:"name" validate:"required,max=255"` - Email string `json:"email" validate:"required,email,max=255"` - Position string `json:"position" validate:"required,max=255"` + Name string `json:"name"` + Email string `json:"email"` + Position string `json:"position"` - ClubID uuid.UUID `json:"-" validate:"required,uuid4"` + ClubID uuid.UUID `json:"-"` PhotoFile File `gorm:"polymorphic:Owner;" json:"photo_file"` } diff --git a/backend/entities/models/tag.go b/backend/entities/models/tag.go index 705210aa8..4d9f15fa2 100644 --- a/backend/entities/models/tag.go +++ b/backend/entities/models/tag.go @@ -5,13 +5,13 @@ import "github.com/google/uuid" type Tag struct { Model - Name string `json:"name" validate:"required,max=255"` + Name string `json:"name"` - CategoryID uuid.UUID `json:"category_id" validate:"required,uuid4"` + CategoryID uuid.UUID `json:"category_id"` - User []User `gorm:"many2many:user_tags;" json:"-" validate:"-"` - Club []Club `gorm:"many2many:club_tags;" json:"-" validate:"-"` - Event []Event `gorm:"many2many:event_tags;" json:"-" validate:"-"` + User []User `gorm:"many2many:user_tags;" json:"-"` + Club []Club `gorm:"many2many:club_tags;" json:"-"` + Event []Event `gorm:"many2many:event_tags;" json:"-"` } type CreateTagRequestBody struct { diff --git a/backend/entities/models/user.go b/backend/entities/models/user.go index c814eb4a5..7eb414e19 100644 --- a/backend/entities/models/user.go +++ b/backend/entities/models/user.go @@ -146,28 +146,28 @@ type Tokens struct { type User struct { Model - Role UserRole `json:"role" validate:"required,oneof=super student"` - FirstName string `json:"first_name" validate:"required,max=255"` - LastName string `json:"last_name" validate:"required,max=255"` - Email string `json:"email" validate:"required,email,max=255"` - PasswordHash string `json:"-" validate:"required,len=97"` - Major0 Major `json:"major0" validate:"not_equal_if_not_empty=Major1,not_equal_if_not_empty=Major2,required,max=255,oneof=africanaStudies americanSignLanguage americanSignLanguage-EnglishInterpreting appliedPhysics architecturalStudies architecture art:ArtVisualStudies behavioralNeuroscience biochemistry bioengineering biology biomedicalPhysics businessAdministration businessAdministration:Accounting businessAdministration:AccountingAndAdvisoryServices businessAdministration:BrandManagement businessAdministration:BusinessAnalytics businessAdministration:CorporateInnovation businessAdministration:EntrepreneurialStartups businessAdministration:FamilyBusiness businessAdministration:Finance businessAdministration:Fintech businessAdministration:HealthcareManagementAndConsulting businessAdministration:Management businessAdministration:ManagementInformationSystems businessAdministration:Marketing businessAdministration:MarketingAnalytics businessAdministration:SocialInnovationAndEntrepreneurship businessAdministration:SupplyChainManagement cellAndMolecularBiology chemicalEngineering chemistry civilEngineering communicationStudies computerEngineering computerScience computingAndLaw criminologyAndCriminalJustice culturalAnthropology cybersecurity dataScience design economics electricalEngineering english environmentalAndSustainabilityStudies environmentalEngineering environmentalScience environmentalStudies gameArtAndAnimation gameDesign globalAsianStudies healthScience history historyCultureAndLaw humanServices industrialEngineering internationalAffairs internationalBusiness internationalBusiness:Accounting internationalBusiness:AccountingAndAdvisoryServices internationalBusiness:BrandManagement internationalBusiness:BusinessAnalytics internationalBusiness:CorporateInnovation internationalBusiness:EntrepreneurialStartups internationalBusiness:FamilyBusiness internationalBusiness:Finance internationalBusiness:Fintech internationalBusiness:HealthcareManagementAndConsulting internationalBusiness:Management internationalBusiness:ManagementInformationSystems internationalBusiness:Marketing internationalBusiness:MarketingAnalytics internationalBusiness:SocialInnovationAndEntrepreneurship internationalBusiness:SupplyChainManagement journalism landscapeArchitecture linguistics marineBiology mathematics mechanicalEngineering mediaAndScreenStudies mediaArts music musicTechnology nursing pharmaceuticalSciences pharmacy(PharmD) philosophy physics politicalScience politicsPhilosophyEconomics psychology publicHealth publicRelations religiousStudies sociology spanish speechLanguagePathologyAndAudiology theatre"` - Major1 Major `json:"major1" validate:"not_equal_if_not_empty=Major0,not_equal_if_not_empty=Major2,omitempty,max=255,oneof=africanaStudies americanSignLanguage americanSignLanguage-EnglishInterpreting appliedPhysics architecturalStudies architecture art:ArtVisualStudies behavioralNeuroscience biochemistry bioengineering biology biomedicalPhysics businessAdministration businessAdministration:Accounting businessAdministration:AccountingAndAdvisoryServices businessAdministration:BrandManagement businessAdministration:BusinessAnalytics businessAdministration:CorporateInnovation businessAdministration:EntrepreneurialStartups businessAdministration:FamilyBusiness businessAdministration:Finance businessAdministration:Fintech businessAdministration:HealthcareManagementAndConsulting businessAdministration:Management businessAdministration:ManagementInformationSystems businessAdministration:Marketing businessAdministration:MarketingAnalytics businessAdministration:SocialInnovationAndEntrepreneurship businessAdministration:SupplyChainManagement cellAndMolecularBiology chemicalEngineering chemistry civilEngineering communicationStudies computerEngineering computerScience computingAndLaw criminologyAndCriminalJustice culturalAnthropology cybersecurity dataScience design economics electricalEngineering english environmentalAndSustainabilityStudies environmentalEngineering environmentalScience environmentalStudies gameArtAndAnimation gameDesign globalAsianStudies healthScience history historyCultureAndLaw humanServices industrialEngineering internationalAffairs internationalBusiness internationalBusiness:Accounting internationalBusiness:AccountingAndAdvisoryServices internationalBusiness:BrandManagement internationalBusiness:BusinessAnalytics internationalBusiness:CorporateInnovation internationalBusiness:EntrepreneurialStartups internationalBusiness:FamilyBusiness internationalBusiness:Finance internationalBusiness:Fintech internationalBusiness:HealthcareManagementAndConsulting internationalBusiness:Management internationalBusiness:ManagementInformationSystems internationalBusiness:Marketing internationalBusiness:MarketingAnalytics internationalBusiness:SocialInnovationAndEntrepreneurship internationalBusiness:SupplyChainManagement journalism landscapeArchitecture linguistics marineBiology mathematics mechanicalEngineering mediaAndScreenStudies mediaArts music musicTechnology nursing pharmaceuticalSciences pharmacy(PharmD) philosophy physics politicalScience politicsPhilosophyEconomics psychology publicHealth publicRelations religiousStudies sociology spanish speechLanguagePathologyAndAudiology theatre"` - Major2 Major `json:"major2" validate:"not_equal_if_not_empty=Major0,not_equal_if_not_empty=Major1,omitempty,max=255,oneof=africanaStudies americanSignLanguage americanSignLanguage-EnglishInterpreting appliedPhysics architecturalStudies architecture art:ArtVisualStudies behavioralNeuroscience biochemistry bioengineering biology biomedicalPhysics businessAdministration businessAdministration:Accounting businessAdministration:AccountingAndAdvisoryServices businessAdministration:BrandManagement businessAdministration:BusinessAnalytics businessAdministration:CorporateInnovation businessAdministration:EntrepreneurialStartups businessAdministration:FamilyBusiness businessAdministration:Finance businessAdministration:Fintech businessAdministration:HealthcareManagementAndConsulting businessAdministration:Management businessAdministration:ManagementInformationSystems businessAdministration:Marketing businessAdministration:MarketingAnalytics businessAdministration:SocialInnovationAndEntrepreneurship businessAdministration:SupplyChainManagement cellAndMolecularBiology chemicalEngineering chemistry civilEngineering communicationStudies computerEngineering computerScience computingAndLaw criminologyAndCriminalJustice culturalAnthropology cybersecurity dataScience design economics electricalEngineering english environmentalAndSustainabilityStudies environmentalEngineering environmentalScience environmentalStudies gameArtAndAnimation gameDesign globalAsianStudies healthScience history historyCultureAndLaw humanServices industrialEngineering internationalAffairs internationalBusiness internationalBusiness:Accounting internationalBusiness:AccountingAndAdvisoryServices internationalBusiness:BrandManagement internationalBusiness:BusinessAnalytics internationalBusiness:CorporateInnovation internationalBusiness:EntrepreneurialStartups internationalBusiness:FamilyBusiness internationalBusiness:Finance internationalBusiness:Fintech internationalBusiness:HealthcareManagementAndConsulting internationalBusiness:Management internationalBusiness:ManagementInformationSystems internationalBusiness:Marketing internationalBusiness:MarketingAnalytics internationalBusiness:SocialInnovationAndEntrepreneurship internationalBusiness:SupplyChainManagement journalism landscapeArchitecture linguistics marineBiology mathematics mechanicalEngineering mediaAndScreenStudies mediaArts music musicTechnology nursing pharmaceuticalSciences pharmacy(PharmD) philosophy physics politicalScience politicsPhilosophyEconomics psychology publicHealth publicRelations religiousStudies sociology spanish speechLanguagePathologyAndAudiology theatre"` - College College `json:"college" validate:"required,max=255"` - GraduationCycle GraduationCycle `json:"graduation_cycle" validate:"required,max=255,oneof=december may"` - GraduationYear int16 `json:"graduation_year" validate:"required"` + Role UserRole `json:"role"` + FirstName string `json:"first_name"` + LastName string `json:"last_name"` + Email string `json:"email"` + PasswordHash string `json:"-"` + Major0 Major `json:"major0"` + Major1 Major `json:"major1"` + Major2 Major `json:"major2"` + College College `json:"college"` + GraduationCycle GraduationCycle `json:"graduation_cycle"` + GraduationYear int16 `json:"graduation_year"` IsVerified bool `json:"is_verified"` - Tag []Tag `gorm:"many2many:user_tags;" json:"-" validate:"-"` - Admin []Club `gorm:"many2many:user_club_admins;" json:"-" validate:"-"` - Member []Club `gorm:"many2many:user_club_members;" json:"-" validate:"-"` - Follower []Club `gorm:"many2many:user_club_followers;" json:"-" validate:"-"` - IntendedApplicant []Club `gorm:"many2many:user_club_intended_applicants;" json:"-" validate:"-"` - Asked []Comment `gorm:"foreignKey:AskedByID;" json:"-" validate:"-"` - Answered []Comment `gorm:"foreignKey:AnsweredByID;" json:"-" validate:"-"` - RSVP []Event `gorm:"many2many:user_event_rsvps;" json:"-" validate:"-"` - Waitlist []Event `gorm:"many2many:user_event_waitlists;" json:"-" validate:"-"` + Tag []Tag `gorm:"many2many:user_tags;" json:"-"` + Admin []Club `gorm:"many2many:user_club_admins;" json:"-"` + Member []Club `gorm:"many2many:user_club_members;" json:"-"` + Follower []Club `gorm:"many2many:user_club_followers;" json:"-"` + IntendedApplicant []Club `gorm:"many2many:user_club_intended_applicants;" json:"-"` + Asked []Comment `gorm:"foreignKey:AskedByID;" json:"-"` + Answered []Comment `gorm:"foreignKey:AnsweredByID;" json:"-"` + RSVP []Event `gorm:"many2many:user_event_rsvps;" json:"-"` + Waitlist []Event `gorm:"many2many:user_event_waitlists;" json:"-"` } type CreateUserRequestBody struct { diff --git a/backend/entities/models/verification.go b/backend/entities/models/verification.go index 96ee2035a..91a4fd217 100644 --- a/backend/entities/models/verification.go +++ b/backend/entities/models/verification.go @@ -14,10 +14,10 @@ const ( ) type Verification struct { - UserID uuid.UUID `json:"user_id" validate:"required,uuid4"` - Token string `json:"token" validate:"required,max=255"` - ExpiresAt time.Time `json:"expires_at" validate:"required"` - Type VerificationType `json:"type" validate:"required,oneof=email_verification password_reset"` + UserID uuid.UUID `json:"user_id"` + Token string `json:"token"` + ExpiresAt time.Time `json:"expires_at"` + Type VerificationType `json:"type"` } type VerifyEmailRequestBody struct { From 122db7de9062e072fd86e467013bc48f0abb946d Mon Sep 17 00:00:00 2001 From: Garrett Ladley <92384606+garrettladley@users.noreply.github.com> Date: Fri, 17 May 2024 19:13:35 -0400 Subject: [PATCH 11/28] db: index columns for common reads (#821) --- backend/migrations/000001_init.up.sql | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/backend/migrations/000001_init.up.sql b/backend/migrations/000001_init.up.sql index 1da905aa0..a397a8cba 100644 --- a/backend/migrations/000001_init.up.sql +++ b/backend/migrations/000001_init.up.sql @@ -21,6 +21,8 @@ CREATE TABLE IF NOT EXISTS users( PRIMARY KEY(id) ); +CREATE UNIQUE INDEX IF NOT EXISTS uni_users_email ON users USING btree ("email"); + CREATE TABLE IF NOT EXISTS clubs( id uuid NOT NULL DEFAULT uuid_generate_v4(), created_at timestamp with time zone NOT NULL DEFAULT CURRENT_TIMESTAMP, @@ -41,6 +43,10 @@ CREATE TABLE IF NOT EXISTS clubs( PRIMARY KEY(id) ); +CREATE UNIQUE INDEX IF NOT EXISTS uni_clubs_name ON clubs USING btree ("name"); +CREATE INDEX IF NOT EXISTS idx_clubs_num_members ON clubs USING btree ("num_members"); +CREATE INDEX IF NOT EXISTS idx_clubs_one_word_to_describe_us ON clubs USING btree ("one_word_to_describe_us"); + CREATE TABLE IF NOT EXISTS series( id uuid NOT NULL DEFAULT uuid_generate_v4(), created_at timestamp with time zone NOT NULL DEFAULT CURRENT_TIMESTAMP, @@ -70,6 +76,8 @@ CREATE TABLE IF NOT EXISTS events( CONSTRAINT fk_series_event FOREIGN key(series_id) REFERENCES series(id) ON UPDATE CASCADE ON DELETE CASCADE ); +CREATE INDEX IF NOT EXISTS idx_events_series_id ON events USING btree ("series_id"); + CREATE TABLE IF NOT EXISTS categories( id uuid NOT NULL DEFAULT uuid_generate_v4(), created_at timestamp with time zone NOT NULL DEFAULT CURRENT_TIMESTAMP, @@ -91,6 +99,8 @@ CREATE TABLE IF NOT EXISTS tags( CONSTRAINT fk_categories_tag FOREIGN key(category_id) REFERENCES categories(id) ON UPDATE CASCADE ON DELETE CASCADE ); +CREATE INDEX IF NOT EXISTS idx_tags_category_id ON tags USING btree ("category_id"); + CREATE TABLE IF NOT EXISTS club_events( club_id uuid NOT NULL DEFAULT uuid_generate_v4(), event_id uuid NOT NULL DEFAULT uuid_generate_v4(), @@ -169,6 +179,7 @@ CREATE TABLE IF NOT EXISTS point_of_contacts( PRIMARY KEY(id), CONSTRAINT fk_clubs_point_of_contact FOREIGN key(club_id) REFERENCES clubs(id) ON UPDATE CASCADE ON DELETE CASCADE ); + CREATE UNIQUE INDEX IF NOT EXISTS compositeindex ON point_of_contacts USING btree ("email","club_id"); CREATE INDEX IF NOT EXISTS idx_point_of_contacts_club_id ON point_of_contacts USING btree ("club_id"); CREATE INDEX IF NOT EXISTS idx_point_of_contacts_email ON point_of_contacts USING btree ("email"); @@ -232,6 +243,7 @@ CREATE TABLE IF NOT EXISTS verifications( "type" varchar(255) NOT NULL, PRIMARY KEY(user_id,expires_at) ); + CREATE UNIQUE INDEX IF NOT EXISTS uni_verifications_token ON verifications USING btree ("token"); COMMIT; From 7984dcbb80f7fa9c700d7c94eb92401eca12903d Mon Sep 17 00:00:00 2001 From: Garrett Ladley <92384606+garrettladley@users.noreply.github.com> Date: Fri, 17 May 2024 19:17:45 -0400 Subject: [PATCH 12/28] backend: plural packages to match routing (#822) --- backend/entities/categories/base/routes.go | 4 ++-- .../categories/{tag => tags}/controller.go | 2 +- .../categories/{tag => tags}/routes.go | 2 +- .../categories/{tag => tags}/service.go | 2 +- .../categories/{tag => tags}/transactions.go | 2 +- backend/entities/clubs/base/routes.go | 24 +++++++++---------- .../clubs/{contact => contacts}/controller.go | 2 +- .../clubs/{contact => contacts}/routes.go | 2 +- .../clubs/{contact => contacts}/service.go | 2 +- .../{contact => contacts}/transactions.go | 2 +- .../clubs/{event => events}/controller.go | 2 +- .../clubs/{event => events}/routes.go | 2 +- .../clubs/{event => events}/service.go | 2 +- .../clubs/{event => events}/transactions.go | 2 +- .../{follower => followers}/controller.go | 2 +- .../clubs/{follower => followers}/routes.go | 2 +- .../clubs/{follower => followers}/service.go | 2 +- .../{follower => followers}/transactions.go | 2 +- .../clubs/{member => members}/controller.go | 2 +- .../clubs/{member => members}/routes.go | 2 +- .../clubs/{member => members}/service.go | 2 +- .../clubs/{member => members}/transactions.go | 8 +++---- .../clubs/{poc => pocs}/controller.go | 2 +- .../entities/clubs/{poc => pocs}/routes.go | 2 +- .../entities/clubs/{poc => pocs}/service.go | 2 +- .../clubs/{poc => pocs}/transactions.go | 2 +- .../clubs/{tag => tags}/controller.go | 2 +- .../entities/clubs/{tag => tags}/routes.go | 2 +- .../entities/clubs/{tag => tags}/service.go | 2 +- .../clubs/{tag => tags}/transactions.go | 2 +- backend/entities/users/base/routes.go | 12 +++++----- .../{follower => followers}/controller.go | 2 +- .../users/{follower => followers}/routes.go | 2 +- .../users/{follower => followers}/service.go | 2 +- .../{follower => followers}/transactions.go | 2 +- .../users/{member => members}/controller.go | 2 +- .../users/{member => members}/routes.go | 2 +- .../users/{member => members}/service.go | 2 +- .../users/{member => members}/transactions.go | 2 +- .../users/{tag => tags}/controller.go | 2 +- backend/entities/users/{tag => tags}/model.go | 2 +- .../entities/users/{tag => tags}/routes.go | 2 +- .../entities/users/{tag => tags}/service.go | 2 +- .../users/{tag => tags}/transactions.go | 2 +- 44 files changed, 64 insertions(+), 64 deletions(-) rename backend/entities/categories/{tag => tags}/controller.go (99%) rename backend/entities/categories/{tag => tags}/routes.go (97%) rename backend/entities/categories/{tag => tags}/service.go (98%) rename backend/entities/categories/{tag => tags}/transactions.go (98%) rename backend/entities/clubs/{contact => contacts}/controller.go (99%) rename backend/entities/clubs/{contact => contacts}/routes.go (97%) rename backend/entities/clubs/{contact => contacts}/service.go (98%) rename backend/entities/clubs/{contact => contacts}/transactions.go (98%) rename backend/entities/clubs/{event => events}/controller.go (98%) rename backend/entities/clubs/{event => events}/routes.go (96%) rename backend/entities/clubs/{event => events}/service.go (98%) rename backend/entities/clubs/{event => events}/transactions.go (97%) rename backend/entities/clubs/{follower => followers}/controller.go (98%) rename backend/entities/clubs/{follower => followers}/routes.go (95%) rename backend/entities/clubs/{follower => followers}/service.go (97%) rename backend/entities/clubs/{follower => followers}/transactions.go (97%) rename backend/entities/clubs/{member => members}/controller.go (99%) rename backend/entities/clubs/{member => members}/routes.go (98%) rename backend/entities/clubs/{member => members}/service.go (98%) rename backend/entities/clubs/{member => members}/transactions.go (90%) rename backend/entities/clubs/{poc => pocs}/controller.go (99%) rename backend/entities/clubs/{poc => pocs}/routes.go (99%) rename backend/entities/clubs/{poc => pocs}/service.go (99%) rename backend/entities/clubs/{poc => pocs}/transactions.go (99%) rename backend/entities/clubs/{tag => tags}/controller.go (99%) rename backend/entities/clubs/{tag => tags}/routes.go (98%) rename backend/entities/clubs/{tag => tags}/service.go (99%) rename backend/entities/clubs/{tag => tags}/transactions.go (98%) rename backend/entities/users/{follower => followers}/controller.go (99%) rename backend/entities/users/{follower => followers}/routes.go (97%) rename backend/entities/users/{follower => followers}/service.go (98%) rename backend/entities/users/{follower => followers}/transactions.go (98%) rename backend/entities/users/{member => members}/controller.go (98%) rename backend/entities/users/{member => members}/routes.go (95%) rename backend/entities/users/{member => members}/service.go (97%) rename backend/entities/users/{member => members}/transactions.go (96%) rename backend/entities/users/{tag => tags}/controller.go (99%) rename backend/entities/users/{tag => tags}/model.go (90%) rename backend/entities/users/{tag => tags}/routes.go (97%) rename backend/entities/users/{tag => tags}/service.go (99%) rename backend/entities/users/{tag => tags}/transactions.go (98%) diff --git a/backend/entities/categories/base/routes.go b/backend/entities/categories/base/routes.go index bda2c8991..a171c0074 100644 --- a/backend/entities/categories/base/routes.go +++ b/backend/entities/categories/base/routes.go @@ -2,7 +2,7 @@ package base import ( "github.com/GenerateNU/sac/backend/auth" - "github.com/GenerateNU/sac/backend/entities/categories/tag" + "github.com/GenerateNU/sac/backend/entities/categories/tags" "github.com/GenerateNU/sac/backend/types" "github.com/garrettladley/fiberpaginate" "github.com/gofiber/fiber/v2" @@ -14,7 +14,7 @@ func CategoryRoutes(categoryParams types.RouteParams) { // update the router in params categoryParams.Router = categoryIDRoute - tag.CategoryTag(categoryParams) + tags.CategoryTag(categoryParams) } func Category(categoryParams types.RouteParams) fiber.Router { diff --git a/backend/entities/categories/tag/controller.go b/backend/entities/categories/tags/controller.go similarity index 99% rename from backend/entities/categories/tag/controller.go rename to backend/entities/categories/tags/controller.go index c66d6a394..8fb211b12 100644 --- a/backend/entities/categories/tag/controller.go +++ b/backend/entities/categories/tags/controller.go @@ -1,4 +1,4 @@ -package tag +package tags import ( "net/http" diff --git a/backend/entities/categories/tag/routes.go b/backend/entities/categories/tags/routes.go similarity index 97% rename from backend/entities/categories/tag/routes.go rename to backend/entities/categories/tags/routes.go index fb6e08253..816dcc9eb 100644 --- a/backend/entities/categories/tag/routes.go +++ b/backend/entities/categories/tags/routes.go @@ -1,4 +1,4 @@ -package tag +package tags import ( "github.com/GenerateNU/sac/backend/types" diff --git a/backend/entities/categories/tag/service.go b/backend/entities/categories/tags/service.go similarity index 98% rename from backend/entities/categories/tag/service.go rename to backend/entities/categories/tags/service.go index d0b95f4c8..7f3dfd63e 100644 --- a/backend/entities/categories/tag/service.go +++ b/backend/entities/categories/tags/service.go @@ -1,4 +1,4 @@ -package tag +package tags import ( "github.com/GenerateNU/sac/backend/entities/models" diff --git a/backend/entities/categories/tag/transactions.go b/backend/entities/categories/tags/transactions.go similarity index 98% rename from backend/entities/categories/tag/transactions.go rename to backend/entities/categories/tags/transactions.go index cc32d8d41..817bcedef 100644 --- a/backend/entities/categories/tag/transactions.go +++ b/backend/entities/categories/tags/transactions.go @@ -1,4 +1,4 @@ -package tag +package tags import ( "errors" diff --git a/backend/entities/clubs/base/routes.go b/backend/entities/clubs/base/routes.go index 90fbfc9f0..5d89fd9ee 100644 --- a/backend/entities/clubs/base/routes.go +++ b/backend/entities/clubs/base/routes.go @@ -2,12 +2,12 @@ package base import ( p "github.com/GenerateNU/sac/backend/auth" - "github.com/GenerateNU/sac/backend/entities/clubs/contact" - "github.com/GenerateNU/sac/backend/entities/clubs/event" - "github.com/GenerateNU/sac/backend/entities/clubs/follower" - "github.com/GenerateNU/sac/backend/entities/clubs/member" - "github.com/GenerateNU/sac/backend/entities/clubs/poc" - "github.com/GenerateNU/sac/backend/entities/clubs/tag" + "github.com/GenerateNU/sac/backend/entities/clubs/contacts" + "github.com/GenerateNU/sac/backend/entities/clubs/events" + "github.com/GenerateNU/sac/backend/entities/clubs/followers" + "github.com/GenerateNU/sac/backend/entities/clubs/members" + "github.com/GenerateNU/sac/backend/entities/clubs/pocs" + "github.com/GenerateNU/sac/backend/entities/clubs/tags" "github.com/GenerateNU/sac/backend/middleware" "github.com/garrettladley/fiberpaginate" @@ -18,12 +18,12 @@ import ( func ClubRoutes(clubParams types.RouteParams) { clubParams.Router = ClubRouter(clubParams) - tag.ClubTag(clubParams) - follower.ClubFollower(clubParams) - member.ClubMember(clubParams) - contact.ClubContact(clubParams) - event.ClubEvent(clubParams) - poc.ClubPointOfContact(clubParams) + tags.ClubTag(clubParams) + followers.ClubFollower(clubParams) + members.ClubMember(clubParams) + contacts.ClubContact(clubParams) + events.ClubEvent(clubParams) + pocs.ClubPointOfContact(clubParams) } func ClubRouter(clubParams types.RouteParams) fiber.Router { diff --git a/backend/entities/clubs/contact/controller.go b/backend/entities/clubs/contacts/controller.go similarity index 99% rename from backend/entities/clubs/contact/controller.go rename to backend/entities/clubs/contacts/controller.go index e037c8500..9ac8c382e 100644 --- a/backend/entities/clubs/contact/controller.go +++ b/backend/entities/clubs/contacts/controller.go @@ -1,4 +1,4 @@ -package contact +package contacts import ( "net/http" diff --git a/backend/entities/clubs/contact/routes.go b/backend/entities/clubs/contacts/routes.go similarity index 97% rename from backend/entities/clubs/contact/routes.go rename to backend/entities/clubs/contacts/routes.go index c2dbeafbe..358408bfb 100644 --- a/backend/entities/clubs/contact/routes.go +++ b/backend/entities/clubs/contacts/routes.go @@ -1,4 +1,4 @@ -package contact +package contacts import ( "github.com/GenerateNU/sac/backend/middleware" diff --git a/backend/entities/clubs/contact/service.go b/backend/entities/clubs/contacts/service.go similarity index 98% rename from backend/entities/clubs/contact/service.go rename to backend/entities/clubs/contacts/service.go index 43b0bf5bf..834dfc506 100644 --- a/backend/entities/clubs/contact/service.go +++ b/backend/entities/clubs/contacts/service.go @@ -1,4 +1,4 @@ -package contact +package contacts import ( "github.com/GenerateNU/sac/backend/entities/models" diff --git a/backend/entities/clubs/contact/transactions.go b/backend/entities/clubs/contacts/transactions.go similarity index 98% rename from backend/entities/clubs/contact/transactions.go rename to backend/entities/clubs/contacts/transactions.go index 77afa555e..5c8ce2bd1 100644 --- a/backend/entities/clubs/contact/transactions.go +++ b/backend/entities/clubs/contacts/transactions.go @@ -1,4 +1,4 @@ -package contact +package contacts import ( "errors" diff --git a/backend/entities/clubs/event/controller.go b/backend/entities/clubs/events/controller.go similarity index 98% rename from backend/entities/clubs/event/controller.go rename to backend/entities/clubs/events/controller.go index e6b3eac52..9f0235657 100644 --- a/backend/entities/clubs/event/controller.go +++ b/backend/entities/clubs/events/controller.go @@ -1,4 +1,4 @@ -package event +package events import ( "net/http" diff --git a/backend/entities/clubs/event/routes.go b/backend/entities/clubs/events/routes.go similarity index 96% rename from backend/entities/clubs/event/routes.go rename to backend/entities/clubs/events/routes.go index c9ca6df01..4aefdf69a 100644 --- a/backend/entities/clubs/event/routes.go +++ b/backend/entities/clubs/events/routes.go @@ -1,4 +1,4 @@ -package event +package events import ( "github.com/GenerateNU/sac/backend/types" diff --git a/backend/entities/clubs/event/service.go b/backend/entities/clubs/events/service.go similarity index 98% rename from backend/entities/clubs/event/service.go rename to backend/entities/clubs/events/service.go index 1db993c82..4f11880f2 100644 --- a/backend/entities/clubs/event/service.go +++ b/backend/entities/clubs/events/service.go @@ -1,4 +1,4 @@ -package event +package events import ( "github.com/GenerateNU/sac/backend/entities/models" diff --git a/backend/entities/clubs/event/transactions.go b/backend/entities/clubs/events/transactions.go similarity index 97% rename from backend/entities/clubs/event/transactions.go rename to backend/entities/clubs/events/transactions.go index 590073eba..f8e681715 100644 --- a/backend/entities/clubs/event/transactions.go +++ b/backend/entities/clubs/events/transactions.go @@ -1,4 +1,4 @@ -package event +package events import ( "github.com/GenerateNU/sac/backend/entities/models" diff --git a/backend/entities/clubs/follower/controller.go b/backend/entities/clubs/followers/controller.go similarity index 98% rename from backend/entities/clubs/follower/controller.go rename to backend/entities/clubs/followers/controller.go index f89e9ddbd..45f8b9217 100644 --- a/backend/entities/clubs/follower/controller.go +++ b/backend/entities/clubs/followers/controller.go @@ -1,4 +1,4 @@ -package follower +package followers import ( "net/http" diff --git a/backend/entities/clubs/follower/routes.go b/backend/entities/clubs/followers/routes.go similarity index 95% rename from backend/entities/clubs/follower/routes.go rename to backend/entities/clubs/followers/routes.go index 1f41a948e..a67a4744e 100644 --- a/backend/entities/clubs/follower/routes.go +++ b/backend/entities/clubs/followers/routes.go @@ -1,4 +1,4 @@ -package follower +package followers import ( "github.com/GenerateNU/sac/backend/types" diff --git a/backend/entities/clubs/follower/service.go b/backend/entities/clubs/followers/service.go similarity index 97% rename from backend/entities/clubs/follower/service.go rename to backend/entities/clubs/followers/service.go index 7f0be47b5..e1fced5c2 100644 --- a/backend/entities/clubs/follower/service.go +++ b/backend/entities/clubs/followers/service.go @@ -1,4 +1,4 @@ -package follower +package followers import ( "github.com/GenerateNU/sac/backend/entities/models" diff --git a/backend/entities/clubs/follower/transactions.go b/backend/entities/clubs/followers/transactions.go similarity index 97% rename from backend/entities/clubs/follower/transactions.go rename to backend/entities/clubs/followers/transactions.go index d8e3b29f5..8a98f8d2e 100644 --- a/backend/entities/clubs/follower/transactions.go +++ b/backend/entities/clubs/followers/transactions.go @@ -1,4 +1,4 @@ -package follower +package followers import ( "github.com/GenerateNU/sac/backend/entities/clubs" diff --git a/backend/entities/clubs/member/controller.go b/backend/entities/clubs/members/controller.go similarity index 99% rename from backend/entities/clubs/member/controller.go rename to backend/entities/clubs/members/controller.go index bb4ee8b09..b5c899bee 100644 --- a/backend/entities/clubs/member/controller.go +++ b/backend/entities/clubs/members/controller.go @@ -1,4 +1,4 @@ -package member +package members import ( "net/http" diff --git a/backend/entities/clubs/member/routes.go b/backend/entities/clubs/members/routes.go similarity index 98% rename from backend/entities/clubs/member/routes.go rename to backend/entities/clubs/members/routes.go index a5e184717..891ec3a7d 100644 --- a/backend/entities/clubs/member/routes.go +++ b/backend/entities/clubs/members/routes.go @@ -1,4 +1,4 @@ -package member +package members import ( "github.com/GenerateNU/sac/backend/middleware" diff --git a/backend/entities/clubs/member/service.go b/backend/entities/clubs/members/service.go similarity index 98% rename from backend/entities/clubs/member/service.go rename to backend/entities/clubs/members/service.go index 5c5508f75..4e23be332 100644 --- a/backend/entities/clubs/member/service.go +++ b/backend/entities/clubs/members/service.go @@ -1,4 +1,4 @@ -package member +package members import ( "github.com/GenerateNU/sac/backend/entities/models" diff --git a/backend/entities/clubs/member/transactions.go b/backend/entities/clubs/members/transactions.go similarity index 90% rename from backend/entities/clubs/member/transactions.go rename to backend/entities/clubs/members/transactions.go index d2987f069..8a0fd1f62 100644 --- a/backend/entities/clubs/member/transactions.go +++ b/backend/entities/clubs/members/transactions.go @@ -1,10 +1,10 @@ -package member +package members import ( "github.com/GenerateNU/sac/backend/entities/clubs" "github.com/GenerateNU/sac/backend/entities/models" "github.com/GenerateNU/sac/backend/entities/users" - "github.com/GenerateNU/sac/backend/entities/users/follower" + "github.com/GenerateNU/sac/backend/entities/users/followers" "github.com/GenerateNU/sac/backend/utilities" "github.com/garrettladley/fiberpaginate" @@ -58,7 +58,7 @@ func CreateClubMember(db *gorm.DB, clubID uuid.UUID, userID uuid.UUID) error { return err } - if err := follower.CreateFollowing(tx, userID, clubID); err != nil { + if err := followers.CreateFollowing(tx, userID, clubID); err != nil { tx.Rollback() return err } @@ -94,7 +94,7 @@ func DeleteClubMember(db *gorm.DB, clubID uuid.UUID, userID uuid.UUID) error { return err } - if err := follower.DeleteFollowing(tx, userID, clubID); err != nil { + if err := followers.DeleteFollowing(tx, userID, clubID); err != nil { tx.Rollback() return err } diff --git a/backend/entities/clubs/poc/controller.go b/backend/entities/clubs/pocs/controller.go similarity index 99% rename from backend/entities/clubs/poc/controller.go rename to backend/entities/clubs/pocs/controller.go index ed07ca213..099b2f5c7 100644 --- a/backend/entities/clubs/poc/controller.go +++ b/backend/entities/clubs/pocs/controller.go @@ -1,4 +1,4 @@ -package poc +package pocs import ( "net/http" diff --git a/backend/entities/clubs/poc/routes.go b/backend/entities/clubs/pocs/routes.go similarity index 99% rename from backend/entities/clubs/poc/routes.go rename to backend/entities/clubs/pocs/routes.go index 759162f4e..55594beef 100644 --- a/backend/entities/clubs/poc/routes.go +++ b/backend/entities/clubs/pocs/routes.go @@ -1,4 +1,4 @@ -package poc +package pocs import ( "github.com/GenerateNU/sac/backend/middleware" diff --git a/backend/entities/clubs/poc/service.go b/backend/entities/clubs/pocs/service.go similarity index 99% rename from backend/entities/clubs/poc/service.go rename to backend/entities/clubs/pocs/service.go index 10164ddee..622304bc7 100644 --- a/backend/entities/clubs/poc/service.go +++ b/backend/entities/clubs/pocs/service.go @@ -1,4 +1,4 @@ -package poc +package pocs import ( "mime/multipart" diff --git a/backend/entities/clubs/poc/transactions.go b/backend/entities/clubs/pocs/transactions.go similarity index 99% rename from backend/entities/clubs/poc/transactions.go rename to backend/entities/clubs/pocs/transactions.go index e1dfb4ac8..f1158b756 100644 --- a/backend/entities/clubs/poc/transactions.go +++ b/backend/entities/clubs/pocs/transactions.go @@ -1,4 +1,4 @@ -package poc +package pocs import ( "errors" diff --git a/backend/entities/clubs/tag/controller.go b/backend/entities/clubs/tags/controller.go similarity index 99% rename from backend/entities/clubs/tag/controller.go rename to backend/entities/clubs/tags/controller.go index b80c6be18..9bad2bf23 100644 --- a/backend/entities/clubs/tag/controller.go +++ b/backend/entities/clubs/tags/controller.go @@ -1,4 +1,4 @@ -package tag +package tags import ( "net/http" diff --git a/backend/entities/clubs/tag/routes.go b/backend/entities/clubs/tags/routes.go similarity index 98% rename from backend/entities/clubs/tag/routes.go rename to backend/entities/clubs/tags/routes.go index 2124ca0c6..b3a5a140b 100644 --- a/backend/entities/clubs/tag/routes.go +++ b/backend/entities/clubs/tags/routes.go @@ -1,4 +1,4 @@ -package tag +package tags import ( "github.com/GenerateNU/sac/backend/middleware" diff --git a/backend/entities/clubs/tag/service.go b/backend/entities/clubs/tags/service.go similarity index 99% rename from backend/entities/clubs/tag/service.go rename to backend/entities/clubs/tags/service.go index 9a19d0a02..8ae50e7eb 100644 --- a/backend/entities/clubs/tag/service.go +++ b/backend/entities/clubs/tags/service.go @@ -1,4 +1,4 @@ -package tag +package tags import ( "github.com/GenerateNU/sac/backend/entities/models" diff --git a/backend/entities/clubs/tag/transactions.go b/backend/entities/clubs/tags/transactions.go similarity index 98% rename from backend/entities/clubs/tag/transactions.go rename to backend/entities/clubs/tags/transactions.go index d5c5aa586..35d691961 100644 --- a/backend/entities/clubs/tag/transactions.go +++ b/backend/entities/clubs/tags/transactions.go @@ -1,4 +1,4 @@ -package tag +package tags import ( "github.com/GenerateNU/sac/backend/entities/clubs" diff --git a/backend/entities/users/base/routes.go b/backend/entities/users/base/routes.go index 0ace408b2..8c4753cf0 100644 --- a/backend/entities/users/base/routes.go +++ b/backend/entities/users/base/routes.go @@ -2,9 +2,9 @@ package base import ( p "github.com/GenerateNU/sac/backend/auth" - "github.com/GenerateNU/sac/backend/entities/users/follower" - "github.com/GenerateNU/sac/backend/entities/users/member" - "github.com/GenerateNU/sac/backend/entities/users/tag" + "github.com/GenerateNU/sac/backend/entities/users/followers" + "github.com/GenerateNU/sac/backend/entities/users/members" + "github.com/GenerateNU/sac/backend/entities/users/tags" "github.com/GenerateNU/sac/backend/types" "github.com/garrettladley/fiberpaginate" @@ -16,9 +16,9 @@ func UserRoutes(userParams types.RouteParams) { userParams.Router = usersRouter - tag.UserTag(userParams) - follower.UserFollower(userParams) - member.UserMember(userParams) + tags.UserTag(userParams) + followers.UserFollower(userParams) + members.UserMember(userParams) } func UsersRouter(userParams types.RouteParams) fiber.Router { diff --git a/backend/entities/users/follower/controller.go b/backend/entities/users/followers/controller.go similarity index 99% rename from backend/entities/users/follower/controller.go rename to backend/entities/users/followers/controller.go index b23cb44cb..b41741937 100644 --- a/backend/entities/users/follower/controller.go +++ b/backend/entities/users/followers/controller.go @@ -1,4 +1,4 @@ -package follower +package followers import ( "net/http" diff --git a/backend/entities/users/follower/routes.go b/backend/entities/users/followers/routes.go similarity index 97% rename from backend/entities/users/follower/routes.go rename to backend/entities/users/followers/routes.go index c01fc1a80..9928f0932 100644 --- a/backend/entities/users/follower/routes.go +++ b/backend/entities/users/followers/routes.go @@ -1,4 +1,4 @@ -package follower +package followers import ( "github.com/GenerateNU/sac/backend/types" diff --git a/backend/entities/users/follower/service.go b/backend/entities/users/followers/service.go similarity index 98% rename from backend/entities/users/follower/service.go rename to backend/entities/users/followers/service.go index 6959af439..2d2af7519 100644 --- a/backend/entities/users/follower/service.go +++ b/backend/entities/users/followers/service.go @@ -1,4 +1,4 @@ -package follower +package followers import ( "github.com/GenerateNU/sac/backend/entities/models" diff --git a/backend/entities/users/follower/transactions.go b/backend/entities/users/followers/transactions.go similarity index 98% rename from backend/entities/users/follower/transactions.go rename to backend/entities/users/followers/transactions.go index c1e7618e0..169f2e9d7 100644 --- a/backend/entities/users/follower/transactions.go +++ b/backend/entities/users/followers/transactions.go @@ -1,4 +1,4 @@ -package follower +package followers import ( "github.com/GenerateNU/sac/backend/entities/clubs" diff --git a/backend/entities/users/member/controller.go b/backend/entities/users/members/controller.go similarity index 98% rename from backend/entities/users/member/controller.go rename to backend/entities/users/members/controller.go index 1d0ae561a..5fb0ae78c 100644 --- a/backend/entities/users/member/controller.go +++ b/backend/entities/users/members/controller.go @@ -1,4 +1,4 @@ -package member +package members import ( "net/http" diff --git a/backend/entities/users/member/routes.go b/backend/entities/users/members/routes.go similarity index 95% rename from backend/entities/users/member/routes.go rename to backend/entities/users/members/routes.go index 038117f22..d3f5bcab5 100644 --- a/backend/entities/users/member/routes.go +++ b/backend/entities/users/members/routes.go @@ -1,4 +1,4 @@ -package member +package members import ( "github.com/GenerateNU/sac/backend/types" diff --git a/backend/entities/users/member/service.go b/backend/entities/users/members/service.go similarity index 97% rename from backend/entities/users/member/service.go rename to backend/entities/users/members/service.go index 302615c09..2fd30dbd4 100644 --- a/backend/entities/users/member/service.go +++ b/backend/entities/users/members/service.go @@ -1,4 +1,4 @@ -package member +package members import ( "github.com/GenerateNU/sac/backend/entities/models" diff --git a/backend/entities/users/member/transactions.go b/backend/entities/users/members/transactions.go similarity index 96% rename from backend/entities/users/member/transactions.go rename to backend/entities/users/members/transactions.go index 88c9fd0fb..de0679011 100644 --- a/backend/entities/users/member/transactions.go +++ b/backend/entities/users/members/transactions.go @@ -1,4 +1,4 @@ -package member +package members import ( "github.com/GenerateNU/sac/backend/entities/models" diff --git a/backend/entities/users/tag/controller.go b/backend/entities/users/tags/controller.go similarity index 99% rename from backend/entities/users/tag/controller.go rename to backend/entities/users/tags/controller.go index 1490068c7..8d34a9fd2 100644 --- a/backend/entities/users/tag/controller.go +++ b/backend/entities/users/tags/controller.go @@ -1,4 +1,4 @@ -package tag +package tags import ( "net/http" diff --git a/backend/entities/users/tag/model.go b/backend/entities/users/tags/model.go similarity index 90% rename from backend/entities/users/tag/model.go rename to backend/entities/users/tags/model.go index e70a8d879..155020975 100644 --- a/backend/entities/users/tag/model.go +++ b/backend/entities/users/tags/model.go @@ -1,4 +1,4 @@ -package tag +package tags import "github.com/google/uuid" diff --git a/backend/entities/users/tag/routes.go b/backend/entities/users/tags/routes.go similarity index 97% rename from backend/entities/users/tag/routes.go rename to backend/entities/users/tags/routes.go index 620c58d11..26aaccc6c 100644 --- a/backend/entities/users/tag/routes.go +++ b/backend/entities/users/tags/routes.go @@ -1,4 +1,4 @@ -package tag +package tags import ( "github.com/GenerateNU/sac/backend/types" diff --git a/backend/entities/users/tag/service.go b/backend/entities/users/tags/service.go similarity index 99% rename from backend/entities/users/tag/service.go rename to backend/entities/users/tags/service.go index 51cce9798..fb5dfed8c 100644 --- a/backend/entities/users/tag/service.go +++ b/backend/entities/users/tags/service.go @@ -1,4 +1,4 @@ -package tag +package tags import ( "github.com/GenerateNU/sac/backend/entities/models" diff --git a/backend/entities/users/tag/transactions.go b/backend/entities/users/tags/transactions.go similarity index 98% rename from backend/entities/users/tag/transactions.go rename to backend/entities/users/tags/transactions.go index edd654d70..5a1945ed4 100644 --- a/backend/entities/users/tag/transactions.go +++ b/backend/entities/users/tags/transactions.go @@ -1,4 +1,4 @@ -package tag +package tags import ( "github.com/GenerateNU/sac/backend/entities/models" From 1d9a41aa5dcfb868e46890807f7c4c2eb7a15e85 Mon Sep 17 00:00:00 2001 From: Garrett Ladley <92384606+garrettladley@users.noreply.github.com> Date: Fri, 17 May 2024 19:48:49 -0400 Subject: [PATCH 13/28] reorg: move request structs to their entities (#824) --- backend/docs/docs.go | 56 +- backend/docs/swagger.json | 11686 ++++++++-------- backend/docs/swagger.yaml | 4342 +++--- backend/entities/auth/base/controller.go | 12 +- backend/entities/auth/base/service.go | 12 +- backend/entities/auth/models.go | 15 + .../entities/categories/base/controller.go | 10 +- backend/entities/categories/base/service.go | 9 +- backend/entities/categories/models.go | 5 + backend/entities/clubs/base/controller.go | 8 +- backend/entities/clubs/base/models.go | 33 + backend/entities/clubs/base/service.go | 10 +- backend/entities/clubs/contacts/controller.go | 5 +- backend/entities/clubs/contacts/models.go | 8 + backend/entities/clubs/contacts/service.go | 4 +- backend/entities/clubs/pocs/controller.go | 5 +- backend/entities/clubs/pocs/models.go | 13 + backend/entities/clubs/pocs/service.go | 8 +- backend/entities/clubs/pocs/transactions.go | 4 +- backend/entities/clubs/tags/controller.go | 5 +- backend/entities/clubs/tags/models.go | 7 + backend/entities/clubs/tags/service.go | 4 +- backend/entities/events/base/controller.go | 6 +- backend/entities/events/base/service.go | 8 +- backend/entities/events/models.go | 71 + backend/entities/events/series/models.go | 5 +- backend/entities/files/base/controller.go | 5 +- backend/entities/files/base/models.go | 8 + backend/entities/files/base/service.go | 4 +- backend/entities/models/category.go | 4 - backend/entities/models/club.go | 31 - backend/entities/models/contact.go | 5 - backend/entities/models/event.go | 63 - backend/entities/models/file.go | 5 - backend/entities/models/poc.go | 12 - backend/entities/models/tag.go | 10 - backend/entities/models/user.go | 39 - backend/entities/tags/base/controller.go | 9 +- backend/entities/tags/base/models.go | 13 + backend/entities/tags/base/service.go | 10 +- backend/entities/users/base/controller.go | 10 +- backend/entities/users/base/models.go | 28 + backend/entities/users/base/service.go | 11 +- backend/utilities/validator.go | 5 +- 44 files changed, 8069 insertions(+), 8554 deletions(-) create mode 100644 backend/entities/auth/models.go create mode 100644 backend/entities/categories/models.go create mode 100644 backend/entities/clubs/base/models.go create mode 100644 backend/entities/clubs/contacts/models.go create mode 100644 backend/entities/clubs/pocs/models.go create mode 100644 backend/entities/clubs/tags/models.go create mode 100644 backend/entities/events/models.go create mode 100644 backend/entities/files/base/models.go create mode 100644 backend/entities/tags/base/models.go create mode 100644 backend/entities/users/base/models.go diff --git a/backend/docs/docs.go b/backend/docs/docs.go index a1b82ac2b..948a0d437 100644 --- a/backend/docs/docs.go +++ b/backend/docs/docs.go @@ -83,7 +83,7 @@ const docTemplate = `{ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/models.LoginUserResponseBody" + "$ref": "#/definitions/models.LoginResponseBody" } } ], @@ -435,7 +435,7 @@ const docTemplate = `{ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/models.CategoryRequestBody" + "$ref": "#/definitions/categories.CategoryRequestBody" } } ], @@ -605,7 +605,7 @@ const docTemplate = `{ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/models.CategoryRequestBody" + "$ref": "#/definitions/categories.CategoryRequestBody" } } ], @@ -814,7 +814,7 @@ const docTemplate = `{ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/models.CreateClubRequestBody" + "$ref": "#/definitions/CreateClubRequestBody" } } ], @@ -956,7 +956,7 @@ const docTemplate = `{ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/models.UpdateClubRequestBody" + "$ref": "#/definitions/UpdateClubRequestBody" } } ], @@ -1057,7 +1057,7 @@ const docTemplate = `{ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/models.PutContactRequestBody" + "$ref": "#/definitions/PutContactRequestBody" } } ], @@ -1735,7 +1735,7 @@ const docTemplate = `{ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/models.CreateClubTagsRequestBody" + "$ref": "#/definitions/CreateClubTagsRequestBody" } } ], @@ -2046,7 +2046,7 @@ const docTemplate = `{ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/models.CreateEventRequestBody" + "$ref": "#/definitions/events.CreateEventRequestBody" } } ], @@ -2322,7 +2322,7 @@ const docTemplate = `{ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/models.UpdateEventRequestBody" + "$ref": "#/definitions/events.UpdateEventRequestBody" } } ], @@ -2626,7 +2626,7 @@ const docTemplate = `{ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/models.CreateFileRequestBody" + "$ref": "#/definitions/CreateFileRequestBody" } } ], @@ -2921,7 +2921,7 @@ const docTemplate = `{ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/models.CreateTagRequestBody" + "$ref": "#/definitions/CreateTagRequestBody" } } ], @@ -3063,7 +3063,7 @@ const docTemplate = `{ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/models.UpdateTagRequestBody" + "$ref": "#/definitions/UpdateTagRequestBody" } } ], @@ -3162,7 +3162,7 @@ const docTemplate = `{ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/models.CreateUserRequestBody" + "$ref": "#/definitions/CreateUserRequestBody" } } ], @@ -3312,7 +3312,7 @@ const docTemplate = `{ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/models.UpdateUserRequestBody" + "$ref": "#/definitions/UpdateUserRequestBody" } } ], @@ -3778,7 +3778,7 @@ const docTemplate = `{ } } }, - "models.CategoryRequestBody": { + "categories.CategoryRequestBody": { "type": "object", "required": [ "name" @@ -3987,7 +3987,7 @@ const docTemplate = `{ "CustomSite" ] }, - "models.CreateClubRequestBody": { + "CreateClubRequestBody": { "type": "object", "required": [ "application_link", @@ -4063,7 +4063,7 @@ const docTemplate = `{ } } }, - "models.CreateClubTagsRequestBody": { + "CreateClubTagsRequestBody": { "type": "object", "required": [ "tags" @@ -4077,7 +4077,7 @@ const docTemplate = `{ } } }, - "models.CreateEventRequestBody": { + "events.CreateEventRequestBody": { "type": "object", "required": [ "content", @@ -4142,7 +4142,7 @@ const docTemplate = `{ } } }, - "models.CreateFileRequestBody": { + "CreateFileRequestBody": { "type": "object", "required": [ "owner_id", @@ -4184,7 +4184,7 @@ const docTemplate = `{ } } }, - "models.CreateTagRequestBody": { + "CreateTagRequestBody": { "type": "object", "required": [ "category_id", @@ -4200,7 +4200,7 @@ const docTemplate = `{ } } }, - "models.CreateUserRequestBody": { + "CreateUserRequestBody": { "type": "object", "required": [ "email", @@ -4727,7 +4727,7 @@ const docTemplate = `{ "May" ] }, - "models.LoginUserResponseBody": { + "models.LoginResponseBody": { "type": "object", "required": [ "email", @@ -4988,7 +4988,7 @@ const docTemplate = `{ } } }, - "models.PutContactRequestBody": { + "PutContactRequestBody": { "type": "object", "required": [ "content", @@ -5125,7 +5125,7 @@ const docTemplate = `{ } } }, - "models.UpdateClubRequestBody": { + "UpdateClubRequestBody": { "type": "object", "required": [ "application_link", @@ -5193,7 +5193,7 @@ const docTemplate = `{ } } }, - "models.UpdateEventRequestBody": { + "events.UpdateEventRequestBody": { "type": "object", "properties": { "content": { @@ -5258,7 +5258,7 @@ const docTemplate = `{ "type": "object", "properties": { "event_details": { - "$ref": "#/definitions/models.UpdateEventRequestBody" + "$ref": "#/definitions/events.UpdateEventRequestBody" }, "max_occurrences": { "type": "integer", @@ -5279,7 +5279,7 @@ const docTemplate = `{ } } }, - "models.UpdateTagRequestBody": { + "UpdateTagRequestBody": { "type": "object", "properties": { "category_id": { @@ -5291,7 +5291,7 @@ const docTemplate = `{ } } }, - "models.UpdateUserRequestBody": { + "UpdateUserRequestBody": { "type": "object", "properties": { "college": { diff --git a/backend/docs/swagger.json b/backend/docs/swagger.json index 7f747478a..005552ea3 100644 --- a/backend/docs/swagger.json +++ b/backend/docs/swagger.json @@ -1,6120 +1,5598 @@ { - "swagger": "2.0", - "info": { - "contact": {} + "swagger": "2.0", + "info": { + "contact": {} + }, + "paths": { + "/auth/forgot-password": { + "post": { + "description": "Generates a password reset token", + "consumes": ["application/json"], + "produces": ["application/json"], + "tags": ["auth"], + "summary": "Generates a password reset token", + "operationId": "forgot-password", + "parameters": [ + { + "description": "Email", + "name": "email", + "in": "body", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/utilities.SuccessResponse" + } + }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "429": { + "description": "Too Many Requests", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} + } + } + } + }, + "/auth/login": { + "post": { + "description": "Logs in a user", + "consumes": ["application/json"], + "produces": ["application/json"], + "tags": ["auth"], + "summary": "Logs in a user", + "operationId": "login-user", + "parameters": [ + { + "description": "Login Body", + "name": "loginBody", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/models.LoginResponseBody" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/models.User" + } + }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "404": { + "description": "Not Found", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} + } + } + } + }, + "/auth/logout": { + "post": { + "description": "Logs out a user", + "consumes": ["application/json"], + "produces": ["application/json"], + "tags": ["auth"], + "summary": "Logs out a user", + "operationId": "logout-user", + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/utilities.SuccessResponse" + } + } + } + } + }, + "/auth/me": { + "get": { + "security": [ + { + "Bearer": [] + } + ], + "description": "Retrieves the currently authenticated user", + "consumes": ["application/json"], + "produces": ["application/json"], + "tags": ["auth"], + "summary": "Retrieves the currently authenticated user", + "operationId": "get-me", + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/models.User" + } + }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "401": { + "description": "Unauthorized", + "schema": {} + }, + "404": { + "description": "Not Found", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} + } + } + } + }, + "/auth/refresh": { + "post": { + "description": "Refreshes a user's access token", + "consumes": ["application/json"], + "produces": ["application/json"], + "tags": ["auth"], + "summary": "Refreshes a user's access token", + "operationId": "refresh-user", + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/utilities.SuccessResponse" + } + }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "404": { + "description": "Not Found", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} + } + } + } + }, + "/auth/send-code": { + "post": { + "description": "Sends a verification code", + "consumes": ["application/json"], + "produces": ["application/json"], + "tags": ["auth"], + "summary": "Sends a verification code", + "operationId": "send-verification-code", + "parameters": [ + { + "description": "Email", + "name": "email", + "in": "body", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/utilities.SuccessResponse" + } + }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "429": { + "description": "Too Many Requests", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} + } + } + } + }, + "/auth/verify-email": { + "post": { + "description": "Verifies an email", + "consumes": ["application/json"], + "produces": ["application/json"], + "tags": ["auth"], + "summary": "Verifies an email", + "operationId": "verify-email", + "parameters": [ + { + "description": "Email Verification Token Body", + "name": "tokenBody", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/models.VerifyEmailRequestBody" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/utilities.SuccessResponse" + } + }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "429": { + "description": "Too Many Requests", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} + } + } + } + }, + "/auth/verify-reset": { + "post": { + "security": [ + { + "Bearer": [] + } + ], + "description": "Verifies a password reset token", + "consumes": ["application/json"], + "produces": ["application/json"], + "tags": ["auth"], + "summary": "Verifies a password reset token", + "operationId": "verify-password-reset-token", + "parameters": [ + { + "description": "Password Reset Token Body", + "name": "tokenBody", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/models.VerifyPasswordResetTokenRequestBody" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/utilities.SuccessResponse" + } + }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "429": { + "description": "Too Many Requests", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} + } + } + } + }, + "/categories/": { + "get": { + "description": "Retrieves all categories", + "produces": ["application/json"], + "tags": ["category"], + "summary": "Retrieve all categories", + "operationId": "get-categories", + "parameters": [ + { + "type": "integer", + "description": "Limit", + "name": "limit", + "in": "query" + }, + { + "type": "integer", + "description": "Page", + "name": "page", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/models.Category" + } + } + }, + "400": { + "description": "Bad Request", + "schema": { + "type": "string" + } + }, + "404": { + "description": "Not Found", + "schema": { + "type": "string" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "type": "string" + } + } + } + }, + "post": { + "description": "Creates a category", + "consumes": ["application/json"], + "produces": ["application/json"], + "tags": ["category"], + "summary": "Creates a category", + "operationId": "create-category", + "parameters": [ + { + "description": "Category Body", + "name": "categoryBody", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/categories.CategoryRequestBody" + } + } + ], + "responses": { + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/models.Category" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "type": "string" + } + }, + "401": { + "description": "Unauthorized", + "schema": { + "type": "string" + } + }, + "404": { + "description": "Not Found", + "schema": { + "type": "string" + } + }, + "409": { + "description": "Conflict", + "schema": { + "type": "string" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "type": "string" + } + } + } + } + }, + "/categories/{categoryID}/": { + "get": { + "description": "Retrieves a category", + "produces": ["application/json"], + "tags": ["category"], + "summary": "Retrieve a category", + "operationId": "get-category", + "parameters": [ + { + "type": "string", + "description": "Category ID", + "name": "categoryID", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/models.Category" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "type": "string" + } + }, + "404": { + "description": "Not Found", + "schema": { + "type": "string" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "type": "string" + } + } + } + }, + "delete": { + "description": "Deletes a category", + "produces": ["application/json"], + "tags": ["category"], + "summary": "Deletes a category", + "operationId": "delete-category", + "parameters": [ + { + "type": "string", + "description": "Category ID", + "name": "categoryID", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "description": "No Content", + "schema": { + "type": "string" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "type": "string" + } + }, + "401": { + "description": "Unauthorized", + "schema": { + "type": "string" + } + }, + "404": { + "description": "Not Found", + "schema": { + "type": "string" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "type": "string" + } + } + } + }, + "patch": { + "description": "Updates a category", + "consumes": ["application/json"], + "produces": ["application/json"], + "tags": ["category"], + "summary": "Updates a category", + "operationId": "update-category", + "parameters": [ + { + "type": "string", + "description": "Category ID", + "name": "categoryID", + "in": "path", + "required": true + }, + { + "description": "Category Body", + "name": "categoryBody", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/categories.CategoryRequestBody" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/models.Category" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "type": "string" + } + }, + "401": { + "description": "Unauthorized", + "schema": { + "type": "string" + } + }, + "404": { + "description": "Not Found", + "schema": { + "type": "string" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "type": "string" + } + } + } + } + }, + "/categories/{categoryID}/tags/": { + "get": { + "description": "Retrieves all tags associated with a category", + "produces": ["application/json"], + "tags": ["category-tag"], + "summary": "Retrieve all tags by category", + "operationId": "get-tags-by-category", + "parameters": [ + { + "type": "string", + "description": "Category ID", + "name": "categoryID", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "Limit", + "name": "limit", + "in": "query" + }, + { + "type": "integer", + "description": "Page", + "name": "page", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/models.Tag" + } + } + }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "404": { + "description": "Not Found", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} + } + } + } + }, + "/categories/{categoryID}/tags/{tagID}/": { + "get": { + "description": "Retrieves a tag associated with a category", + "produces": ["application/json"], + "tags": ["category-tag"], + "summary": "Retrieve a tag by category", + "operationId": "get-tag-by-category", + "parameters": [ + { + "type": "string", + "description": "Category ID", + "name": "categoryID", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "Tag ID", + "name": "tagID", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/models.Tag" + } + }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "404": { + "description": "Not Found", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} + } + } + } + }, + "/clubs/": { + "get": { + "description": "Retrieves all clubs", + "produces": ["application/json"], + "tags": ["club"], + "summary": "Retrieve all clubs", + "operationId": "get-all-clubs", + "parameters": [ + { + "type": "integer", + "description": "Limit", + "name": "limit", + "in": "query" + }, + { + "type": "integer", + "description": "Page", + "name": "page", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/models.Club" + } + } + }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} + } + } + }, + "post": { + "description": "Creates a club", + "consumes": ["application/json"], + "produces": ["application/json"], + "tags": ["club"], + "summary": "Create a club", + "operationId": "create-club", + "parameters": [ + { + "description": "Club", + "name": "club", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/CreateClubRequestBody" + } + } + ], + "responses": { + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/models.Club" + } + }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "401": { + "description": "Unauthorized", + "schema": {} + }, + "404": { + "description": "Not Found", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} + } + } + } + }, + "/clubs/{clubID}/": { + "get": { + "description": "Retrieves a club", + "produces": ["application/json"], + "tags": ["club"], + "summary": "Retrieve a club", + "operationId": "get-club", + "parameters": [ + { + "type": "string", + "description": "Club ID", + "name": "clubID", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/models.Club" + } + }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "404": { + "description": "Not Found", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} + } + } + }, + "delete": { + "description": "Deletes a club", + "produces": ["application/json"], + "tags": ["club"], + "summary": "Delete a club", + "operationId": "delete-club", + "parameters": [ + { + "type": "string", + "description": "Club ID", + "name": "clubID", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "description": "No Content", + "schema": { + "type": "string" + } + }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "401": { + "description": "Unauthorized", + "schema": {} + }, + "404": { + "description": "Not Found", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} + } + } + }, + "patch": { + "description": "Updates a club", + "consumes": ["application/json"], + "produces": ["application/json"], + "tags": ["club"], + "summary": "Update a club", + "operationId": "update-club", + "parameters": [ + { + "type": "string", + "description": "Club ID", + "name": "clubID", + "in": "path", + "required": true + }, + { + "description": "Club", + "name": "club", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/UpdateClubRequestBody" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/models.Club" + } + }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "401": { + "description": "Unauthorized", + "schema": {} + }, + "404": { + "description": "Not Found", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} + } + } + } + }, + "/clubs/{clubID}/contacts/": { + "get": { + "description": "Retrieves all contacts associated with a club", + "produces": ["application/json"], + "tags": ["club-contact"], + "summary": "Retrieve all contacts for a club", + "operationId": "get-contacts-by-club", + "parameters": [ + { + "type": "string", + "description": "Club ID", + "name": "clubID", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/models.Contact" + } + } + }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "404": { + "description": "Not Found", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} + } + } + }, + "put": { + "description": "Creates a contact", + "consumes": ["application/json"], + "produces": ["application/json"], + "tags": ["club-contact"], + "summary": "Creates a contact", + "operationId": "put-contact", + "parameters": [ + { + "type": "string", + "description": "Club ID", + "name": "clubID", + "in": "path", + "required": true + }, + { + "description": "Contact Body", + "name": "contactBody", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/PutContactRequestBody" + } + } + ], + "responses": { + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/models.Contact" + } + }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "401": { + "description": "Unauthorized", + "schema": {} + }, + "404": { + "description": "Not Found", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} + } + } + } + }, + "/clubs/{clubID}/events/": { + "get": { + "description": "Retrieves all events associated with a club", + "produces": ["application/json"], + "tags": ["club-event"], + "summary": "Retrieve all events for a club", + "operationId": "get-events-by-club", + "parameters": [ + { + "type": "string", + "description": "Club ID", + "name": "clubID", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "Limit", + "name": "limit", + "in": "query" + }, + { + "type": "integer", + "description": "Page", + "name": "page", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/models.Event" + } + } + }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "404": { + "description": "Not Found", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} + } + } + } + }, + "/clubs/{clubID}/followers/": { + "get": { + "description": "Retrieves all followers associated with a club", + "produces": ["application/json"], + "tags": ["club-follower"], + "summary": "Retrieve all followers for a club", + "operationId": "get-followers-by-club", + "parameters": [ + { + "type": "string", + "description": "Club ID", + "name": "clubID", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "Limit", + "name": "limit", + "in": "query" + }, + { + "type": "integer", + "description": "Page", + "name": "page", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/models.User" + } + } + }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "404": { + "description": "Not Found", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} + } + } + } + }, + "/clubs/{clubID}/members/": { + "get": { + "description": "Retrieves all members associated with a club", + "produces": ["application/json"], + "tags": ["club-member"], + "summary": "Retrieve all members for a club", + "operationId": "get-members-by-club", + "parameters": [ + { + "type": "string", + "description": "Club ID", + "name": "clubID", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "Limit", + "name": "limit", + "in": "query" + }, + { + "type": "integer", + "description": "Page", + "name": "page", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/models.User" + } + } + }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "401": { + "description": "Unauthorized", + "schema": {} + }, + "404": { + "description": "Not Found", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} + } + } + }, + "post": { + "description": "Creates a new member associated with a club", + "consumes": ["application/json"], + "produces": ["application/json"], + "tags": ["club-member"], + "summary": "Create a new member for a club", + "operationId": "create-member-for-club", + "parameters": [ + { + "type": "string", + "description": "Club ID", + "name": "clubID", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "User ID", + "name": "userID", + "in": "path", + "required": true + } + ], + "responses": { + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/models.User" + } + }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "401": { + "description": "Unauthorized", + "schema": {} + }, + "404": { + "description": "Not Found", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} + } + } + }, + "delete": { + "description": "Deletes a member associated with a club", + "produces": ["application/json"], + "tags": ["club-member"], + "summary": "Delete a member from a club", + "operationId": "delete-member-from-club", + "parameters": [ + { + "type": "string", + "description": "Club ID", + "name": "clubID", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "User ID", + "name": "userID", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "description": "No Content", + "schema": { + "$ref": "#/definitions/models.User" + } + }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "401": { + "description": "Unauthorized", + "schema": {} + }, + "404": { + "description": "Not Found", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} + } + } + } + }, + "/clubs/{clubID}/poc/": { + "post": { + "description": "Creates a point of contact associated with a club", + "consumes": ["multipart/form-data"], + "produces": ["application/json"], + "tags": ["club-point-of-contact"], + "summary": "Create a point of contact for a club", + "operationId": "create-point-of-contact-by-club", + "parameters": [ + { + "type": "string", + "description": "Club ID", + "name": "clubID", + "in": "path", + "required": true + } + ], + "responses": { + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/models.PointOfContact" + } + }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "401": { + "description": "Unauthorized", + "schema": {} + }, + "404": { + "description": "Not Found", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} + } + } + } + }, + "/clubs/{clubID}/poc/{pocID}": { + "put": { + "description": "Updates a point of contact associated with a club", + "consumes": ["application/json"], + "produces": ["application/json"], + "tags": ["club-point-of-contact"], + "summary": "Update a point of contact for a club", + "operationId": "update-point-of-contact-by-club", + "parameters": [ + { + "type": "string", + "description": "Club ID", + "name": "clubID", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "Point of Contact ID", + "name": "pocID", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/models.PointOfContact" + } + }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "401": { + "description": "Unauthorized", + "schema": {} + }, + "404": { + "description": "Not Found", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} + } + } + }, + "delete": { + "description": "Delete a point of contact associated with a club", + "produces": ["application/json"], + "tags": ["club-point-of-contact"], + "summary": "Delete a point of contact for a club", + "operationId": "delete-point-of-contact-by-club", + "parameters": [ + { + "type": "string", + "description": "Club ID", + "name": "clubID", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "Point of Contact ID", + "name": "pocID", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "404": { + "description": "Not Found", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} + } + } + }, + "patch": { + "description": "Updates a point of contact photo associated with a club", + "consumes": ["multipart/form-data"], + "produces": ["application/json"], + "tags": ["club-point-of-contact"], + "summary": "Update a point of contact photo for a club", + "operationId": "update-point-of-contact-photo-by-club", + "parameters": [ + { + "type": "string", + "description": "Club ID", + "name": "clubID", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "Point of Contact ID", + "name": "pocID", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/models.PointOfContact" + } + }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "401": { + "description": "Unauthorized", + "schema": {} + }, + "404": { + "description": "Not Found", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} + } + } + } + }, + "/clubs/{clubID}/pocs/": { + "get": { + "description": "Retrieves all point of contacts associated with a club", + "produces": ["application/json"], + "tags": ["club-point-of-contact"], + "summary": "Retrieve all point of contacts for a club", + "operationId": "get-point-of-contacts-by-club", + "parameters": [ + { + "type": "string", + "description": "Club ID", + "name": "clubID", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/models.PointOfContact" + } + } + }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "404": { + "description": "Not Found", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} + } + } + } + }, + "/clubs/{clubID}/pocs/{pocID}": { + "get": { + "description": "Retrieves a point of contact associated with a club", + "produces": ["application/json"], + "tags": ["club-point-of-contact"], + "summary": "Retrieve a point of contact for a club", + "operationId": "get-point-of-contact-by-club", + "parameters": [ + { + "type": "string", + "description": "Club ID", + "name": "clubID", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "Point of Contact ID", + "name": "pocID", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/models.PointOfContact" + } + }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "404": { + "description": "Not Found", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} + } + } + } + }, + "/clubs/{clubID}/tags/": { + "get": { + "description": "Retrieves all tags associated with a club", + "produces": ["application/json"], + "tags": ["club-tag"], + "summary": "Retrieve all tags for a club", + "operationId": "get-tags-by-club", + "parameters": [ + { + "type": "string", + "description": "Club ID", + "name": "clubID", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/models.Tag" + } + } + }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "404": { + "description": "Not Found", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} + } + } + }, + "post": { + "description": "Creates tags for a club", + "consumes": ["application/json"], + "produces": ["application/json"], + "tags": ["club-tag"], + "summary": "Create club tags", + "operationId": "create-club-tags", + "parameters": [ + { + "type": "string", + "description": "Club ID", + "name": "clubID", + "in": "path", + "required": true + }, + { + "description": "Club Tags Body", + "name": "clubTagsBody", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/CreateClubTagsRequestBody" + } + } + ], + "responses": { + "201": { + "description": "Created", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/models.Tag" + } + } + }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "401": { + "description": "Unauthorized", + "schema": {} + }, + "404": { + "description": "Not Found", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} + } + } + } + }, + "/clubs/{clubID}/tags/{tagID}/": { + "delete": { + "description": "Deletes a tag associated with a club", + "produces": ["application/json"], + "tags": ["club-tag"], + "summary": "Delete a tag for a club", + "operationId": "delete-tag-by-club", + "parameters": [ + { + "type": "string", + "description": "Club ID", + "name": "clubID", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "Tag ID", + "name": "tagID", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "description": "No Content", + "schema": { + "type": "string" + } + }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "401": { + "description": "Unauthorized", + "schema": {} + }, + "404": { + "description": "Not Found", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} + } + } + } + }, + "/contacts/": { + "get": { + "description": "Retrieves all contacts", + "produces": ["application/json"], + "tags": ["contact"], + "summary": "Retrieve all contacts", + "operationId": "get-contacts", + "parameters": [ + { + "type": "integer", + "description": "Limit", + "name": "limit", + "in": "query" + }, + { + "type": "integer", + "description": "Page", + "name": "page", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/models.Contact" + } + } + }, + "400": { + "description": "Bad Request", + "schema": { + "type": "string" + } + }, + "404": { + "description": "Not Found", + "schema": { + "type": "string" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "type": "string" + } + } + } + } + }, + "/contacts/{contactID}/": { + "get": { + "description": "Retrieves a contact by id", + "consumes": ["application/json"], + "produces": ["application/json"], + "tags": ["contact"], + "summary": "Retrieves a contact", + "operationId": "get-contact", + "parameters": [ + { + "type": "string", + "description": "Contact ID", + "name": "contactID", + "in": "path", + "required": true + } + ], + "responses": { + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/models.Contact" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "type": "string" + } + }, + "404": { + "description": "Not Found", + "schema": { + "type": "string" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "type": "string" + } + } + } + }, + "delete": { + "description": "Deletes a contact", + "consumes": ["application/json"], + "produces": ["application/json"], + "tags": ["contact"], + "summary": "Deletes a contact", + "operationId": "delete-contact", + "parameters": [ + { + "type": "string", + "description": "Contact ID", + "name": "contactID", + "in": "path", + "required": true + } + ], + "responses": { + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/models.Contact" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "type": "string" + } + }, + "404": { + "description": "Not Found", + "schema": { + "type": "string" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "type": "string" + } + } + } + } + }, + "/events/": { + "get": { + "description": "Retrieves all events", + "produces": ["application/json"], + "tags": ["event"], + "summary": "Retrieve all events", + "operationId": "get-all-events", + "parameters": [ + { + "type": "integer", + "description": "Limit", + "name": "limit", + "in": "query" + }, + { + "type": "integer", + "description": "Page", + "name": "page", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/models.Event" + } + } + }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "404": { + "description": "Not Found", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} + } + } + }, + "post": { + "description": "Creates an event", + "consumes": ["application/json"], + "produces": ["application/json"], + "tags": ["event"], + "summary": "Create an event", + "operationId": "create-event", + "parameters": [ + { + "description": "Event Body", + "name": "event", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/events.CreateEventRequestBody" + } + } + ], + "responses": { + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/models.Event" + } + }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "401": { + "description": "Unauthorized", + "schema": {} + }, + "404": { + "description": "Not Found", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} + } + } + } + }, + "/events/{eventID}/": { + "get": { + "description": "Retrieves an event", + "produces": ["application/json"], + "tags": ["event"], + "summary": "Retrieve an event", + "operationId": "get-event", + "parameters": [ + { + "type": "string", + "description": "Event ID", + "name": "eventID", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/models.Event" + } + }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "404": { + "description": "Not Found", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} + } + } + }, + "delete": { + "description": "Deletes an event", + "produces": ["application/json"], + "tags": ["event"], + "summary": "Delete an event", + "operationId": "delete-event", + "parameters": [ + { + "type": "string", + "description": "Event ID", + "name": "eventID", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "description": "No Content", + "schema": { + "type": "string" + } + }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "401": { + "description": "Unauthorized", + "schema": {} + }, + "404": { + "description": "Not Found", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} + } + } + } + }, + "/events/{eventID}/hosts": { + "get": { + "description": "Retrieves all hosts associated with an event", + "produces": ["application/json"], + "tags": ["event"], + "summary": "Retrieve all hosts by event", + "operationId": "get-hosts-by-event", + "parameters": [ + { + "type": "string", + "description": "Event ID", + "name": "eventID", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/models.Club" + } + } + }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "404": { + "description": "Not Found", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} + } + } + } + }, + "/events/{eventID}/series/": { + "get": { + "description": "Retrieves all series associated with an event", + "produces": ["application/json"], + "tags": ["event"], + "summary": "Retrieve all series by event", + "operationId": "get-series-by-event", + "parameters": [ + { + "type": "string", + "description": "Event ID", + "name": "eventID", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/models.Series" + } + } + }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "404": { + "description": "Not Found", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} + } + } + }, + "delete": { + "description": "Deletes all series associated with an event", + "produces": ["application/json"], + "tags": ["event"], + "summary": "Delete all series by event", + "operationId": "delete-series-by-event", + "parameters": [ + { + "type": "string", + "description": "Event ID", + "name": "eventID", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "description": "No Content", + "schema": { + "type": "string" + } + }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "401": { + "description": "Unauthorized", + "schema": {} + }, + "404": { + "description": "Not Found", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} + } + } + }, + "patch": { + "description": "Creates a series", + "consumes": ["application/json"], + "produces": ["application/json"], + "tags": ["event"], + "summary": "Create a series", + "operationId": "create-series", + "parameters": [ + { + "type": "string", + "description": "Event ID", + "name": "eventID", + "in": "path", + "required": true + }, + { + "description": "Series Body", + "name": "seriesBody", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/events.UpdateEventRequestBody" + } + } + ], + "responses": { + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/models.Series" + } + }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "401": { + "description": "Unauthorized", + "schema": {} + }, + "404": { + "description": "Not Found", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} + } + } + } + }, + "/events/{eventID}/series/{seriesID}/": { + "get": { + "description": "Retrieves a series by ID", + "produces": ["application/json"], + "tags": ["event"], + "summary": "Retrieve a series by ID", + "operationId": "get-series-by-id", + "parameters": [ + { + "type": "string", + "description": "Event ID", + "name": "eventID", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "Series ID", + "name": "seriesID", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/models.Series" + } + }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "404": { + "description": "Not Found", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} + } + } + }, + "delete": { + "description": "Deletes a series by ID", + "produces": ["application/json"], + "tags": ["event"], + "summary": "Delete a series by ID", + "operationId": "delete-series-by-id", + "parameters": [ + { + "type": "string", + "description": "Event ID", + "name": "eventID", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "Series ID", + "name": "seriesID", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "description": "No Content", + "schema": { + "type": "string" + } + }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "401": { + "description": "Unauthorized", + "schema": {} + }, + "404": { + "description": "Not Found", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} + } + } + }, + "patch": { + "description": "Updates a series by event ID", + "consumes": ["application/json"], + "produces": ["application/json"], + "tags": ["event"], + "summary": "Update a series by event ID", + "operationId": "update-series-by-event-id", + "parameters": [ + { + "type": "string", + "description": "Event ID", + "name": "eventID", + "in": "path", + "required": true + }, + { + "description": "Series Body", + "name": "seriesBody", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/models.UpdateSeriesRequestBody" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/models.Series" + } + }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "401": { + "description": "Unauthorized", + "schema": {} + }, + "404": { + "description": "Not Found", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} + } + } + } + }, + "/events/{eventID}/tags": { + "get": { + "description": "Retrieves all tags associated with an event", + "produces": ["application/json"], + "tags": ["event"], + "summary": "Retrieve all tags by event", + "operationId": "get-tags-by-event", + "parameters": [ + { + "type": "string", + "description": "Event ID", + "name": "eventID", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/models.Tag" + } + } + }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "404": { + "description": "Not Found", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} + } + } + } + }, + "/files/": { + "get": { + "description": "Retrieves all files", + "produces": ["application/json"], + "tags": ["file"], + "summary": "Retrieve all files", + "operationId": "get-files", + "parameters": [ + { + "type": "integer", + "description": "Limit", + "name": "limit", + "in": "query" + }, + { + "type": "integer", + "description": "Page", + "name": "page", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/models.File" + } + } + }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "401": { + "description": "Unauthorized", + "schema": {} + }, + "404": { + "description": "Not Found", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} + } + } + }, + "post": { + "description": "Creates a file", + "consumes": ["multipart/form-data"], + "produces": ["application/json"], + "tags": ["file"], + "summary": "Create a file", + "operationId": "create-file", + "parameters": [ + { + "description": "File", + "name": "file", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/CreateFileRequestBody" + } + } + ], + "responses": { + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/models.File" + } + }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "401": { + "description": "Unauthorized", + "schema": {} + }, + "404": { + "description": "Not Found", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} + } + } + } + }, + "/files/:fileID": { + "get": { + "description": "Retrieves a file", + "produces": ["application/json"], + "tags": ["file"], + "summary": "Retrieve a file", + "operationId": "get-file", + "parameters": [ + { + "type": "string", + "description": "File ID", + "name": "fileID", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/models.File" + } + }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "401": { + "description": "Unauthorized", + "schema": {} + }, + "404": { + "description": "Not Found", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} + } + } + }, + "delete": { + "description": "Deletes a file", + "produces": ["application/json"], + "tags": ["file"], + "summary": "Delete a file", + "operationId": "delete-file", + "parameters": [ + { + "type": "string", + "description": "File ID", + "name": "fileID", + "in": "path", + "required": true + } + ], + "responses": { + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/models.File" + } + }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "401": { + "description": "Unauthorized", + "schema": {} + }, + "404": { + "description": "Not Found", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} + } + } + } + }, + "/pocs/": { + "get": { + "description": "Retrieves all point of contacts", + "produces": ["application/json"], + "tags": ["point of contact"], + "summary": "Retrieve all point of contacts", + "operationId": "get-point-of-contacts", + "parameters": [ + { + "type": "integer", + "description": "Limit", + "name": "limit", + "in": "query" + }, + { + "type": "integer", + "description": "Page", + "name": "page", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/models.PointOfContact" + } + } + }, + "400": { + "description": "Bad Request", + "schema": { + "type": "string" + } + }, + "404": { + "description": "Not Found", + "schema": { + "type": "string" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "type": "string" + } + } + } + } + }, + "/pocs/{pocID}/": { + "get": { + "description": "Retrieves a point of contact by id", + "produces": ["application/json"], + "tags": ["point of contact"], + "summary": "Retrieves a point of contact", + "operationId": "get-point-of-contact", + "parameters": [ + { + "type": "string", + "description": "Point of Contact ID", + "name": "pocID", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/models.PointOfContact" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "type": "string" + } + }, + "404": { + "description": "Not Found", + "schema": { + "type": "string" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "type": "string" + } + } + } + } + }, + "/tags": { + "get": { + "description": "Retrieves all tags", + "produces": ["application/json"], + "tags": ["tag"], + "summary": "Retrieve all tags", + "operationId": "get-all-tags", + "parameters": [ + { + "type": "integer", + "description": "Limit", + "name": "limit", + "in": "query" + }, + { + "type": "integer", + "description": "Page", + "name": "page", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/models.Tag" + } + } + }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "404": { + "description": "Not Found", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} + } + } + } + }, + "/tags/": { + "post": { + "description": "Creates a tag", + "consumes": ["application/json"], + "produces": ["application/json"], + "tags": ["tag"], + "summary": "Create a tag", + "operationId": "create-tag", + "parameters": [ + { + "description": "Tag Body", + "name": "tagBody", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/CreateTagRequestBody" + } + } + ], + "responses": { + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/models.Tag" + } + }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "401": { + "description": "Unauthorized", + "schema": {} + }, + "404": { + "description": "Not Found", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} + } + } + } + }, + "/tags/{tagID}/": { + "get": { + "description": "Retrieves a tag", + "produces": ["application/json"], + "tags": ["tag"], + "summary": "Retrieve a tag", + "operationId": "get-tag", + "parameters": [ + { + "type": "string", + "description": "Tag ID", + "name": "tagID", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/models.Tag" + } + }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "404": { + "description": "Not Found", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} + } + } + }, + "delete": { + "description": "Deletes a tag", + "produces": ["application/json"], + "tags": ["tag"], + "summary": "Delete a tag", + "operationId": "delete-tag", + "parameters": [ + { + "type": "string", + "description": "Tag ID", + "name": "tagID", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "description": "No Content", + "schema": { + "type": "string" + } + }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "401": { + "description": "Unauthorized", + "schema": {} + }, + "404": { + "description": "Not Found", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} + } + } + }, + "patch": { + "description": "Updates a tag", + "consumes": ["application/json"], + "produces": ["application/json"], + "tags": ["tag"], + "summary": "Update a tag", + "operationId": "update-tag", + "parameters": [ + { + "type": "string", + "description": "Tag ID", + "name": "tagID", + "in": "path", + "required": true + }, + { + "description": "Tag", + "name": "tag", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/UpdateTagRequestBody" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/models.Tag" + } + }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "401": { + "description": "Unauthorized", + "schema": {} + }, + "404": { + "description": "Not Found", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} + } + } + } + }, + "/users/": { + "get": { + "description": "Retrieves all users", + "produces": ["application/json"], + "tags": ["user"], + "summary": "Retrieve all users", + "operationId": "get-users", + "parameters": [ + { + "type": "integer", + "description": "Limit", + "name": "limit", + "in": "query" + }, + { + "type": "integer", + "description": "Page", + "name": "page", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/models.User" + } + } + }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "401": { + "description": "Unauthorized", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} + } + } + }, + "post": { + "description": "Creates a user", + "consumes": ["application/json"], + "produces": ["application/json"], + "tags": ["user"], + "summary": "Create a user", + "operationId": "create-user", + "parameters": [ + { + "description": "User Body", + "name": "userBody", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/CreateUserRequestBody" + } + } + ], + "responses": { + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/models.User" + } + }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "401": { + "description": "Unauthorized", + "schema": {} + }, + "404": { + "description": "Not Found", + "schema": {} + }, + "409": { + "description": "Conflict", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} + } + } + } + }, + "/users/{userID}/": { + "get": { + "description": "Retrieves a user", + "produces": ["application/json"], + "tags": ["user"], + "summary": "Retrieve a user", + "operationId": "get-user", + "parameters": [ + { + "type": "string", + "description": "User ID", + "name": "userID", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/models.User" + } + }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "401": { + "description": "Unauthorized", + "schema": {} + }, + "404": { + "description": "Not Found", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} + } + } + }, + "delete": { + "description": "Deletes a user", + "produces": ["application/json"], + "tags": ["user"], + "summary": "Delete a user", + "operationId": "delete-user", + "parameters": [ + { + "type": "string", + "description": "User ID", + "name": "userID", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "description": "No Content", + "schema": { + "type": "string" + } + }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "401": { + "description": "Unauthorized", + "schema": {} + }, + "404": { + "description": "Not Found", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} + } + } + }, + "patch": { + "description": "Updates a user", + "consumes": ["application/json"], + "produces": ["application/json"], + "tags": ["user"], + "summary": "Update a user", + "operationId": "update-user", + "parameters": [ + { + "type": "string", + "description": "User ID", + "name": "userID", + "in": "path", + "required": true + }, + { + "description": "User Body", + "name": "userBody", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/UpdateUserRequestBody" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/models.User" + } + }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "401": { + "description": "Unauthorized", + "schema": {} + }, + "404": { + "description": "Not Found", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} + } + } + } }, - "paths": { - "/auth/forgot-password": { - "post": { - "description": "Generates a password reset token", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "auth" - ], - "summary": "Generates a password reset token", - "operationId": "forgot-password", - "parameters": [ - { - "description": "Email", - "name": "email", - "in": "body", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/utilities.SuccessResponse" - } - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "429": { - "description": "Too Many Requests", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - } - }, - "/auth/login": { - "post": { - "description": "Logs in a user", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "auth" - ], - "summary": "Logs in a user", - "operationId": "login-user", - "parameters": [ - { - "description": "Login Body", - "name": "loginBody", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/models.LoginUserResponseBody" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/models.User" - } - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "404": { - "description": "Not Found", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - } - }, - "/auth/logout": { - "post": { - "description": "Logs out a user", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "auth" - ], - "summary": "Logs out a user", - "operationId": "logout-user", - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/utilities.SuccessResponse" - } - } - } - } - }, - "/auth/me": { - "get": { - "security": [ - { - "Bearer": [] - } - ], - "description": "Retrieves the currently authenticated user", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "auth" - ], - "summary": "Retrieves the currently authenticated user", - "operationId": "get-me", - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/models.User" - } - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "401": { - "description": "Unauthorized", - "schema": {} - }, - "404": { - "description": "Not Found", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - } - }, - "/auth/refresh": { - "post": { - "description": "Refreshes a user's access token", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "auth" - ], - "summary": "Refreshes a user's access token", - "operationId": "refresh-user", - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/utilities.SuccessResponse" - } - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "404": { - "description": "Not Found", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - } - }, - "/auth/send-code": { - "post": { - "description": "Sends a verification code", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "auth" - ], - "summary": "Sends a verification code", - "operationId": "send-verification-code", - "parameters": [ - { - "description": "Email", - "name": "email", - "in": "body", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/utilities.SuccessResponse" - } - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "429": { - "description": "Too Many Requests", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - } - }, - "/auth/verify-email": { - "post": { - "description": "Verifies an email", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "auth" - ], - "summary": "Verifies an email", - "operationId": "verify-email", - "parameters": [ - { - "description": "Email Verification Token Body", - "name": "tokenBody", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/models.VerifyEmailRequestBody" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/utilities.SuccessResponse" - } - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "429": { - "description": "Too Many Requests", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - } - }, - "/auth/verify-reset": { - "post": { - "security": [ - { - "Bearer": [] - } - ], - "description": "Verifies a password reset token", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "auth" - ], - "summary": "Verifies a password reset token", - "operationId": "verify-password-reset-token", - "parameters": [ - { - "description": "Password Reset Token Body", - "name": "tokenBody", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/models.VerifyPasswordResetTokenRequestBody" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/utilities.SuccessResponse" - } - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "429": { - "description": "Too Many Requests", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - } - }, - "/categories/": { - "get": { - "description": "Retrieves all categories", - "produces": [ - "application/json" - ], - "tags": [ - "category" - ], - "summary": "Retrieve all categories", - "operationId": "get-categories", - "parameters": [ - { - "type": "integer", - "description": "Limit", - "name": "limit", - "in": "query" - }, - { - "type": "integer", - "description": "Page", - "name": "page", - "in": "query" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/models.Category" - } - } - }, - "400": { - "description": "Bad Request", - "schema": { - "type": "string" - } - }, - "404": { - "description": "Not Found", - "schema": { - "type": "string" - } - }, - "500": { - "description": "Internal Server Error", - "schema": { - "type": "string" - } - } - } - }, - "post": { - "description": "Creates a category", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "category" - ], - "summary": "Creates a category", - "operationId": "create-category", - "parameters": [ - { - "description": "Category Body", - "name": "categoryBody", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/models.CategoryRequestBody" - } - } - ], - "responses": { - "201": { - "description": "Created", - "schema": { - "$ref": "#/definitions/models.Category" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "type": "string" - } - }, - "401": { - "description": "Unauthorized", - "schema": { - "type": "string" - } - }, - "404": { - "description": "Not Found", - "schema": { - "type": "string" - } - }, - "409": { - "description": "Conflict", - "schema": { - "type": "string" - } - }, - "500": { - "description": "Internal Server Error", - "schema": { - "type": "string" - } - } - } - } - }, - "/categories/{categoryID}/": { - "get": { - "description": "Retrieves a category", - "produces": [ - "application/json" - ], - "tags": [ - "category" - ], - "summary": "Retrieve a category", - "operationId": "get-category", - "parameters": [ - { - "type": "string", - "description": "Category ID", - "name": "categoryID", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/models.Category" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "type": "string" - } - }, - "404": { - "description": "Not Found", - "schema": { - "type": "string" - } - }, - "500": { - "description": "Internal Server Error", - "schema": { - "type": "string" - } - } - } - }, - "delete": { - "description": "Deletes a category", - "produces": [ - "application/json" - ], - "tags": [ - "category" - ], - "summary": "Deletes a category", - "operationId": "delete-category", - "parameters": [ - { - "type": "string", - "description": "Category ID", - "name": "categoryID", - "in": "path", - "required": true - } - ], - "responses": { - "204": { - "description": "No Content", - "schema": { - "type": "string" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "type": "string" - } - }, - "401": { - "description": "Unauthorized", - "schema": { - "type": "string" - } - }, - "404": { - "description": "Not Found", - "schema": { - "type": "string" - } - }, - "500": { - "description": "Internal Server Error", - "schema": { - "type": "string" - } - } - } - }, - "patch": { - "description": "Updates a category", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "category" - ], - "summary": "Updates a category", - "operationId": "update-category", - "parameters": [ - { - "type": "string", - "description": "Category ID", - "name": "categoryID", - "in": "path", - "required": true - }, - { - "description": "Category Body", - "name": "categoryBody", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/models.CategoryRequestBody" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/models.Category" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "type": "string" - } - }, - "401": { - "description": "Unauthorized", - "schema": { - "type": "string" - } - }, - "404": { - "description": "Not Found", - "schema": { - "type": "string" - } - }, - "500": { - "description": "Internal Server Error", - "schema": { - "type": "string" - } - } - } - } - }, - "/categories/{categoryID}/tags/": { - "get": { - "description": "Retrieves all tags associated with a category", - "produces": [ - "application/json" - ], - "tags": [ - "category-tag" - ], - "summary": "Retrieve all tags by category", - "operationId": "get-tags-by-category", - "parameters": [ - { - "type": "string", - "description": "Category ID", - "name": "categoryID", - "in": "path", - "required": true - }, - { - "type": "integer", - "description": "Limit", - "name": "limit", - "in": "query" - }, - { - "type": "integer", - "description": "Page", - "name": "page", - "in": "query" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/models.Tag" - } - } - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "404": { - "description": "Not Found", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - } - }, - "/categories/{categoryID}/tags/{tagID}/": { - "get": { - "description": "Retrieves a tag associated with a category", - "produces": [ - "application/json" - ], - "tags": [ - "category-tag" - ], - "summary": "Retrieve a tag by category", - "operationId": "get-tag-by-category", - "parameters": [ - { - "type": "string", - "description": "Category ID", - "name": "categoryID", - "in": "path", - "required": true - }, - { - "type": "string", - "description": "Tag ID", - "name": "tagID", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/models.Tag" - } - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "404": { - "description": "Not Found", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - } - }, - "/clubs/": { - "get": { - "description": "Retrieves all clubs", - "produces": [ - "application/json" - ], - "tags": [ - "club" - ], - "summary": "Retrieve all clubs", - "operationId": "get-all-clubs", - "parameters": [ - { - "type": "integer", - "description": "Limit", - "name": "limit", - "in": "query" - }, - { - "type": "integer", - "description": "Page", - "name": "page", - "in": "query" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/models.Club" - } - } - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - }, - "post": { - "description": "Creates a club", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "club" - ], - "summary": "Create a club", - "operationId": "create-club", - "parameters": [ - { - "description": "Club", - "name": "club", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/models.CreateClubRequestBody" - } - } - ], - "responses": { - "201": { - "description": "Created", - "schema": { - "$ref": "#/definitions/models.Club" - } - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "401": { - "description": "Unauthorized", - "schema": {} - }, - "404": { - "description": "Not Found", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - } - }, - "/clubs/{clubID}/": { - "get": { - "description": "Retrieves a club", - "produces": [ - "application/json" - ], - "tags": [ - "club" - ], - "summary": "Retrieve a club", - "operationId": "get-club", - "parameters": [ - { - "type": "string", - "description": "Club ID", - "name": "clubID", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/models.Club" - } - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "404": { - "description": "Not Found", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - }, - "delete": { - "description": "Deletes a club", - "produces": [ - "application/json" - ], - "tags": [ - "club" - ], - "summary": "Delete a club", - "operationId": "delete-club", - "parameters": [ - { - "type": "string", - "description": "Club ID", - "name": "clubID", - "in": "path", - "required": true - } - ], - "responses": { - "204": { - "description": "No Content", - "schema": { - "type": "string" - } - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "401": { - "description": "Unauthorized", - "schema": {} - }, - "404": { - "description": "Not Found", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - }, - "patch": { - "description": "Updates a club", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "club" - ], - "summary": "Update a club", - "operationId": "update-club", - "parameters": [ - { - "type": "string", - "description": "Club ID", - "name": "clubID", - "in": "path", - "required": true - }, - { - "description": "Club", - "name": "club", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/models.UpdateClubRequestBody" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/models.Club" - } - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "401": { - "description": "Unauthorized", - "schema": {} - }, - "404": { - "description": "Not Found", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - } - }, - "/clubs/{clubID}/contacts/": { - "get": { - "description": "Retrieves all contacts associated with a club", - "produces": [ - "application/json" - ], - "tags": [ - "club-contact" - ], - "summary": "Retrieve all contacts for a club", - "operationId": "get-contacts-by-club", - "parameters": [ - { - "type": "string", - "description": "Club ID", - "name": "clubID", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/models.Contact" - } - } - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "404": { - "description": "Not Found", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - }, - "put": { - "description": "Creates a contact", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "club-contact" - ], - "summary": "Creates a contact", - "operationId": "put-contact", - "parameters": [ - { - "type": "string", - "description": "Club ID", - "name": "clubID", - "in": "path", - "required": true - }, - { - "description": "Contact Body", - "name": "contactBody", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/models.PutContactRequestBody" - } - } - ], - "responses": { - "201": { - "description": "Created", - "schema": { - "$ref": "#/definitions/models.Contact" - } - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "401": { - "description": "Unauthorized", - "schema": {} - }, - "404": { - "description": "Not Found", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - } - }, - "/clubs/{clubID}/events/": { - "get": { - "description": "Retrieves all events associated with a club", - "produces": [ - "application/json" - ], - "tags": [ - "club-event" - ], - "summary": "Retrieve all events for a club", - "operationId": "get-events-by-club", - "parameters": [ - { - "type": "string", - "description": "Club ID", - "name": "clubID", - "in": "path", - "required": true - }, - { - "type": "integer", - "description": "Limit", - "name": "limit", - "in": "query" - }, - { - "type": "integer", - "description": "Page", - "name": "page", - "in": "query" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/models.Event" - } - } - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "404": { - "description": "Not Found", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - } - }, - "/clubs/{clubID}/followers/": { - "get": { - "description": "Retrieves all followers associated with a club", - "produces": [ - "application/json" - ], - "tags": [ - "club-follower" - ], - "summary": "Retrieve all followers for a club", - "operationId": "get-followers-by-club", - "parameters": [ - { - "type": "string", - "description": "Club ID", - "name": "clubID", - "in": "path", - "required": true - }, - { - "type": "integer", - "description": "Limit", - "name": "limit", - "in": "query" - }, - { - "type": "integer", - "description": "Page", - "name": "page", - "in": "query" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/models.User" - } - } - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "404": { - "description": "Not Found", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - } - }, - "/clubs/{clubID}/members/": { - "get": { - "description": "Retrieves all members associated with a club", - "produces": [ - "application/json" - ], - "tags": [ - "club-member" - ], - "summary": "Retrieve all members for a club", - "operationId": "get-members-by-club", - "parameters": [ - { - "type": "string", - "description": "Club ID", - "name": "clubID", - "in": "path", - "required": true - }, - { - "type": "integer", - "description": "Limit", - "name": "limit", - "in": "query" - }, - { - "type": "integer", - "description": "Page", - "name": "page", - "in": "query" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/models.User" - } - } - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "401": { - "description": "Unauthorized", - "schema": {} - }, - "404": { - "description": "Not Found", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - }, - "post": { - "description": "Creates a new member associated with a club", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "club-member" - ], - "summary": "Create a new member for a club", - "operationId": "create-member-for-club", - "parameters": [ - { - "type": "string", - "description": "Club ID", - "name": "clubID", - "in": "path", - "required": true - }, - { - "type": "string", - "description": "User ID", - "name": "userID", - "in": "path", - "required": true - } - ], - "responses": { - "201": { - "description": "Created", - "schema": { - "$ref": "#/definitions/models.User" - } - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "401": { - "description": "Unauthorized", - "schema": {} - }, - "404": { - "description": "Not Found", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - }, - "delete": { - "description": "Deletes a member associated with a club", - "produces": [ - "application/json" - ], - "tags": [ - "club-member" - ], - "summary": "Delete a member from a club", - "operationId": "delete-member-from-club", - "parameters": [ - { - "type": "string", - "description": "Club ID", - "name": "clubID", - "in": "path", - "required": true - }, - { - "type": "string", - "description": "User ID", - "name": "userID", - "in": "path", - "required": true - } - ], - "responses": { - "204": { - "description": "No Content", - "schema": { - "$ref": "#/definitions/models.User" - } - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "401": { - "description": "Unauthorized", - "schema": {} - }, - "404": { - "description": "Not Found", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - } - }, - "/clubs/{clubID}/poc/": { - "post": { - "description": "Creates a point of contact associated with a club", - "consumes": [ - "multipart/form-data" - ], - "produces": [ - "application/json" - ], - "tags": [ - "club-point-of-contact" - ], - "summary": "Create a point of contact for a club", - "operationId": "create-point-of-contact-by-club", - "parameters": [ - { - "type": "string", - "description": "Club ID", - "name": "clubID", - "in": "path", - "required": true - } - ], - "responses": { - "201": { - "description": "Created", - "schema": { - "$ref": "#/definitions/models.PointOfContact" - } - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "401": { - "description": "Unauthorized", - "schema": {} - }, - "404": { - "description": "Not Found", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - } - }, - "/clubs/{clubID}/poc/{pocID}": { - "put": { - "description": "Updates a point of contact associated with a club", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "club-point-of-contact" - ], - "summary": "Update a point of contact for a club", - "operationId": "update-point-of-contact-by-club", - "parameters": [ - { - "type": "string", - "description": "Club ID", - "name": "clubID", - "in": "path", - "required": true - }, - { - "type": "string", - "description": "Point of Contact ID", - "name": "pocID", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/models.PointOfContact" - } - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "401": { - "description": "Unauthorized", - "schema": {} - }, - "404": { - "description": "Not Found", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - }, - "delete": { - "description": "Delete a point of contact associated with a club", - "produces": [ - "application/json" - ], - "tags": [ - "club-point-of-contact" - ], - "summary": "Delete a point of contact for a club", - "operationId": "delete-point-of-contact-by-club", - "parameters": [ - { - "type": "string", - "description": "Club ID", - "name": "clubID", - "in": "path", - "required": true - }, - { - "type": "string", - "description": "Point of Contact ID", - "name": "pocID", - "in": "path", - "required": true - } - ], - "responses": { - "204": { - "description": "No Content" - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "404": { - "description": "Not Found", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - }, - "patch": { - "description": "Updates a point of contact photo associated with a club", - "consumes": [ - "multipart/form-data" - ], - "produces": [ - "application/json" - ], - "tags": [ - "club-point-of-contact" - ], - "summary": "Update a point of contact photo for a club", - "operationId": "update-point-of-contact-photo-by-club", - "parameters": [ - { - "type": "string", - "description": "Club ID", - "name": "clubID", - "in": "path", - "required": true - }, - { - "type": "string", - "description": "Point of Contact ID", - "name": "pocID", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/models.PointOfContact" - } - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "401": { - "description": "Unauthorized", - "schema": {} - }, - "404": { - "description": "Not Found", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - } - }, - "/clubs/{clubID}/pocs/": { - "get": { - "description": "Retrieves all point of contacts associated with a club", - "produces": [ - "application/json" - ], - "tags": [ - "club-point-of-contact" - ], - "summary": "Retrieve all point of contacts for a club", - "operationId": "get-point-of-contacts-by-club", - "parameters": [ - { - "type": "string", - "description": "Club ID", - "name": "clubID", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/models.PointOfContact" - } - } - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "404": { - "description": "Not Found", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - } - }, - "/clubs/{clubID}/pocs/{pocID}": { - "get": { - "description": "Retrieves a point of contact associated with a club", - "produces": [ - "application/json" - ], - "tags": [ - "club-point-of-contact" - ], - "summary": "Retrieve a point of contact for a club", - "operationId": "get-point-of-contact-by-club", - "parameters": [ - { - "type": "string", - "description": "Club ID", - "name": "clubID", - "in": "path", - "required": true - }, - { - "type": "string", - "description": "Point of Contact ID", - "name": "pocID", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/models.PointOfContact" - } - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "404": { - "description": "Not Found", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - } - }, - "/clubs/{clubID}/tags/": { - "get": { - "description": "Retrieves all tags associated with a club", - "produces": [ - "application/json" - ], - "tags": [ - "club-tag" - ], - "summary": "Retrieve all tags for a club", - "operationId": "get-tags-by-club", - "parameters": [ - { - "type": "string", - "description": "Club ID", - "name": "clubID", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/models.Tag" - } - } - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "404": { - "description": "Not Found", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - }, - "post": { - "description": "Creates tags for a club", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "club-tag" - ], - "summary": "Create club tags", - "operationId": "create-club-tags", - "parameters": [ - { - "type": "string", - "description": "Club ID", - "name": "clubID", - "in": "path", - "required": true - }, - { - "description": "Club Tags Body", - "name": "clubTagsBody", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/models.CreateClubTagsRequestBody" - } - } - ], - "responses": { - "201": { - "description": "Created", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/models.Tag" - } - } - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "401": { - "description": "Unauthorized", - "schema": {} - }, - "404": { - "description": "Not Found", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - } - }, - "/clubs/{clubID}/tags/{tagID}/": { - "delete": { - "description": "Deletes a tag associated with a club", - "produces": [ - "application/json" - ], - "tags": [ - "club-tag" - ], - "summary": "Delete a tag for a club", - "operationId": "delete-tag-by-club", - "parameters": [ - { - "type": "string", - "description": "Club ID", - "name": "clubID", - "in": "path", - "required": true - }, - { - "type": "string", - "description": "Tag ID", - "name": "tagID", - "in": "path", - "required": true - } - ], - "responses": { - "204": { - "description": "No Content", - "schema": { - "type": "string" - } - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "401": { - "description": "Unauthorized", - "schema": {} - }, - "404": { - "description": "Not Found", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - } - }, - "/contacts/": { - "get": { - "description": "Retrieves all contacts", - "produces": [ - "application/json" - ], - "tags": [ - "contact" - ], - "summary": "Retrieve all contacts", - "operationId": "get-contacts", - "parameters": [ - { - "type": "integer", - "description": "Limit", - "name": "limit", - "in": "query" - }, - { - "type": "integer", - "description": "Page", - "name": "page", - "in": "query" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/models.Contact" - } - } - }, - "400": { - "description": "Bad Request", - "schema": { - "type": "string" - } - }, - "404": { - "description": "Not Found", - "schema": { - "type": "string" - } - }, - "500": { - "description": "Internal Server Error", - "schema": { - "type": "string" - } - } - } - } - }, - "/contacts/{contactID}/": { - "get": { - "description": "Retrieves a contact by id", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "contact" - ], - "summary": "Retrieves a contact", - "operationId": "get-contact", - "parameters": [ - { - "type": "string", - "description": "Contact ID", - "name": "contactID", - "in": "path", - "required": true - } - ], - "responses": { - "201": { - "description": "Created", - "schema": { - "$ref": "#/definitions/models.Contact" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "type": "string" - } - }, - "404": { - "description": "Not Found", - "schema": { - "type": "string" - } - }, - "500": { - "description": "Internal Server Error", - "schema": { - "type": "string" - } - } - } - }, - "delete": { - "description": "Deletes a contact", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "contact" - ], - "summary": "Deletes a contact", - "operationId": "delete-contact", - "parameters": [ - { - "type": "string", - "description": "Contact ID", - "name": "contactID", - "in": "path", - "required": true - } - ], - "responses": { - "201": { - "description": "Created", - "schema": { - "$ref": "#/definitions/models.Contact" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "type": "string" - } - }, - "404": { - "description": "Not Found", - "schema": { - "type": "string" - } - }, - "500": { - "description": "Internal Server Error", - "schema": { - "type": "string" - } - } - } - } - }, - "/events/": { - "get": { - "description": "Retrieves all events", - "produces": [ - "application/json" - ], - "tags": [ - "event" - ], - "summary": "Retrieve all events", - "operationId": "get-all-events", - "parameters": [ - { - "type": "integer", - "description": "Limit", - "name": "limit", - "in": "query" - }, - { - "type": "integer", - "description": "Page", - "name": "page", - "in": "query" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/models.Event" - } - } - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "404": { - "description": "Not Found", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - }, - "post": { - "description": "Creates an event", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "event" - ], - "summary": "Create an event", - "operationId": "create-event", - "parameters": [ - { - "description": "Event Body", - "name": "event", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/models.CreateEventRequestBody" - } - } - ], - "responses": { - "201": { - "description": "Created", - "schema": { - "$ref": "#/definitions/models.Event" - } - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "401": { - "description": "Unauthorized", - "schema": {} - }, - "404": { - "description": "Not Found", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - } - }, - "/events/{eventID}/": { - "get": { - "description": "Retrieves an event", - "produces": [ - "application/json" - ], - "tags": [ - "event" - ], - "summary": "Retrieve an event", - "operationId": "get-event", - "parameters": [ - { - "type": "string", - "description": "Event ID", - "name": "eventID", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/models.Event" - } - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "404": { - "description": "Not Found", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - }, - "delete": { - "description": "Deletes an event", - "produces": [ - "application/json" - ], - "tags": [ - "event" - ], - "summary": "Delete an event", - "operationId": "delete-event", - "parameters": [ - { - "type": "string", - "description": "Event ID", - "name": "eventID", - "in": "path", - "required": true - } - ], - "responses": { - "204": { - "description": "No Content", - "schema": { - "type": "string" - } - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "401": { - "description": "Unauthorized", - "schema": {} - }, - "404": { - "description": "Not Found", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - } - }, - "/events/{eventID}/hosts": { - "get": { - "description": "Retrieves all hosts associated with an event", - "produces": [ - "application/json" - ], - "tags": [ - "event" - ], - "summary": "Retrieve all hosts by event", - "operationId": "get-hosts-by-event", - "parameters": [ - { - "type": "string", - "description": "Event ID", - "name": "eventID", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/models.Club" - } - } - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "404": { - "description": "Not Found", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - } - }, - "/events/{eventID}/series/": { - "get": { - "description": "Retrieves all series associated with an event", - "produces": [ - "application/json" - ], - "tags": [ - "event" - ], - "summary": "Retrieve all series by event", - "operationId": "get-series-by-event", - "parameters": [ - { - "type": "string", - "description": "Event ID", - "name": "eventID", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/models.Series" - } - } - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "404": { - "description": "Not Found", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - }, - "delete": { - "description": "Deletes all series associated with an event", - "produces": [ - "application/json" - ], - "tags": [ - "event" - ], - "summary": "Delete all series by event", - "operationId": "delete-series-by-event", - "parameters": [ - { - "type": "string", - "description": "Event ID", - "name": "eventID", - "in": "path", - "required": true - } - ], - "responses": { - "204": { - "description": "No Content", - "schema": { - "type": "string" - } - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "401": { - "description": "Unauthorized", - "schema": {} - }, - "404": { - "description": "Not Found", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - }, - "patch": { - "description": "Creates a series", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "event" - ], - "summary": "Create a series", - "operationId": "create-series", - "parameters": [ - { - "type": "string", - "description": "Event ID", - "name": "eventID", - "in": "path", - "required": true - }, - { - "description": "Series Body", - "name": "seriesBody", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/models.UpdateEventRequestBody" - } - } - ], - "responses": { - "201": { - "description": "Created", - "schema": { - "$ref": "#/definitions/models.Series" - } - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "401": { - "description": "Unauthorized", - "schema": {} - }, - "404": { - "description": "Not Found", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - } - }, - "/events/{eventID}/series/{seriesID}/": { - "get": { - "description": "Retrieves a series by ID", - "produces": [ - "application/json" - ], - "tags": [ - "event" - ], - "summary": "Retrieve a series by ID", - "operationId": "get-series-by-id", - "parameters": [ - { - "type": "string", - "description": "Event ID", - "name": "eventID", - "in": "path", - "required": true - }, - { - "type": "string", - "description": "Series ID", - "name": "seriesID", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/models.Series" - } - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "404": { - "description": "Not Found", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - }, - "delete": { - "description": "Deletes a series by ID", - "produces": [ - "application/json" - ], - "tags": [ - "event" - ], - "summary": "Delete a series by ID", - "operationId": "delete-series-by-id", - "parameters": [ - { - "type": "string", - "description": "Event ID", - "name": "eventID", - "in": "path", - "required": true - }, - { - "type": "string", - "description": "Series ID", - "name": "seriesID", - "in": "path", - "required": true - } - ], - "responses": { - "204": { - "description": "No Content", - "schema": { - "type": "string" - } - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "401": { - "description": "Unauthorized", - "schema": {} - }, - "404": { - "description": "Not Found", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - }, - "patch": { - "description": "Updates a series by event ID", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "event" - ], - "summary": "Update a series by event ID", - "operationId": "update-series-by-event-id", - "parameters": [ - { - "type": "string", - "description": "Event ID", - "name": "eventID", - "in": "path", - "required": true - }, - { - "description": "Series Body", - "name": "seriesBody", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/models.UpdateSeriesRequestBody" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/models.Series" - } - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "401": { - "description": "Unauthorized", - "schema": {} - }, - "404": { - "description": "Not Found", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - } - }, - "/events/{eventID}/tags": { - "get": { - "description": "Retrieves all tags associated with an event", - "produces": [ - "application/json" - ], - "tags": [ - "event" - ], - "summary": "Retrieve all tags by event", - "operationId": "get-tags-by-event", - "parameters": [ - { - "type": "string", - "description": "Event ID", - "name": "eventID", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/models.Tag" - } - } - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "404": { - "description": "Not Found", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - } - }, - "/files/": { - "get": { - "description": "Retrieves all files", - "produces": [ - "application/json" - ], - "tags": [ - "file" - ], - "summary": "Retrieve all files", - "operationId": "get-files", - "parameters": [ - { - "type": "integer", - "description": "Limit", - "name": "limit", - "in": "query" - }, - { - "type": "integer", - "description": "Page", - "name": "page", - "in": "query" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/models.File" - } - } - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "401": { - "description": "Unauthorized", - "schema": {} - }, - "404": { - "description": "Not Found", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - }, - "post": { - "description": "Creates a file", - "consumes": [ - "multipart/form-data" - ], - "produces": [ - "application/json" - ], - "tags": [ - "file" - ], - "summary": "Create a file", - "operationId": "create-file", - "parameters": [ - { - "description": "File", - "name": "file", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/models.CreateFileRequestBody" - } - } - ], - "responses": { - "201": { - "description": "Created", - "schema": { - "$ref": "#/definitions/models.File" - } - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "401": { - "description": "Unauthorized", - "schema": {} - }, - "404": { - "description": "Not Found", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - } - }, - "/files/:fileID": { - "get": { - "description": "Retrieves a file", - "produces": [ - "application/json" - ], - "tags": [ - "file" - ], - "summary": "Retrieve a file", - "operationId": "get-file", - "parameters": [ - { - "type": "string", - "description": "File ID", - "name": "fileID", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/models.File" - } - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "401": { - "description": "Unauthorized", - "schema": {} - }, - "404": { - "description": "Not Found", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - }, - "delete": { - "description": "Deletes a file", - "produces": [ - "application/json" - ], - "tags": [ - "file" - ], - "summary": "Delete a file", - "operationId": "delete-file", - "parameters": [ - { - "type": "string", - "description": "File ID", - "name": "fileID", - "in": "path", - "required": true - } - ], - "responses": { - "201": { - "description": "Created", - "schema": { - "$ref": "#/definitions/models.File" - } - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "401": { - "description": "Unauthorized", - "schema": {} - }, - "404": { - "description": "Not Found", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - } - }, - "/pocs/": { - "get": { - "description": "Retrieves all point of contacts", - "produces": [ - "application/json" - ], - "tags": [ - "point of contact" - ], - "summary": "Retrieve all point of contacts", - "operationId": "get-point-of-contacts", - "parameters": [ - { - "type": "integer", - "description": "Limit", - "name": "limit", - "in": "query" - }, - { - "type": "integer", - "description": "Page", - "name": "page", - "in": "query" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/models.PointOfContact" - } - } - }, - "400": { - "description": "Bad Request", - "schema": { - "type": "string" - } - }, - "404": { - "description": "Not Found", - "schema": { - "type": "string" - } - }, - "500": { - "description": "Internal Server Error", - "schema": { - "type": "string" - } - } - } - } - }, - "/pocs/{pocID}/": { - "get": { - "description": "Retrieves a point of contact by id", - "produces": [ - "application/json" - ], - "tags": [ - "point of contact" - ], - "summary": "Retrieves a point of contact", - "operationId": "get-point-of-contact", - "parameters": [ - { - "type": "string", - "description": "Point of Contact ID", - "name": "pocID", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/models.PointOfContact" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "type": "string" - } - }, - "404": { - "description": "Not Found", - "schema": { - "type": "string" - } - }, - "500": { - "description": "Internal Server Error", - "schema": { - "type": "string" - } - } - } - } - }, - "/tags": { - "get": { - "description": "Retrieves all tags", - "produces": [ - "application/json" - ], - "tags": [ - "tag" - ], - "summary": "Retrieve all tags", - "operationId": "get-all-tags", - "parameters": [ - { - "type": "integer", - "description": "Limit", - "name": "limit", - "in": "query" - }, - { - "type": "integer", - "description": "Page", - "name": "page", - "in": "query" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/models.Tag" - } - } - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "404": { - "description": "Not Found", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - } - }, - "/tags/": { - "post": { - "description": "Creates a tag", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "tag" - ], - "summary": "Create a tag", - "operationId": "create-tag", - "parameters": [ - { - "description": "Tag Body", - "name": "tagBody", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/models.CreateTagRequestBody" - } - } - ], - "responses": { - "201": { - "description": "Created", - "schema": { - "$ref": "#/definitions/models.Tag" - } - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "401": { - "description": "Unauthorized", - "schema": {} - }, - "404": { - "description": "Not Found", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - } - }, - "/tags/{tagID}/": { - "get": { - "description": "Retrieves a tag", - "produces": [ - "application/json" - ], - "tags": [ - "tag" - ], - "summary": "Retrieve a tag", - "operationId": "get-tag", - "parameters": [ - { - "type": "string", - "description": "Tag ID", - "name": "tagID", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/models.Tag" - } - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "404": { - "description": "Not Found", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - }, - "delete": { - "description": "Deletes a tag", - "produces": [ - "application/json" - ], - "tags": [ - "tag" - ], - "summary": "Delete a tag", - "operationId": "delete-tag", - "parameters": [ - { - "type": "string", - "description": "Tag ID", - "name": "tagID", - "in": "path", - "required": true - } - ], - "responses": { - "204": { - "description": "No Content", - "schema": { - "type": "string" - } - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "401": { - "description": "Unauthorized", - "schema": {} - }, - "404": { - "description": "Not Found", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - }, - "patch": { - "description": "Updates a tag", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "tag" - ], - "summary": "Update a tag", - "operationId": "update-tag", - "parameters": [ - { - "type": "string", - "description": "Tag ID", - "name": "tagID", - "in": "path", - "required": true - }, - { - "description": "Tag", - "name": "tag", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/models.UpdateTagRequestBody" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/models.Tag" - } - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "401": { - "description": "Unauthorized", - "schema": {} - }, - "404": { - "description": "Not Found", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - } - }, - "/users/": { - "get": { - "description": "Retrieves all users", - "produces": [ - "application/json" - ], - "tags": [ - "user" - ], - "summary": "Retrieve all users", - "operationId": "get-users", - "parameters": [ - { - "type": "integer", - "description": "Limit", - "name": "limit", - "in": "query" - }, - { - "type": "integer", - "description": "Page", - "name": "page", - "in": "query" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/models.User" - } - } - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "401": { - "description": "Unauthorized", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - }, - "post": { - "description": "Creates a user", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "user" - ], - "summary": "Create a user", - "operationId": "create-user", - "parameters": [ - { - "description": "User Body", - "name": "userBody", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/models.CreateUserRequestBody" - } - } - ], - "responses": { - "201": { - "description": "Created", - "schema": { - "$ref": "#/definitions/models.User" - } - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "401": { - "description": "Unauthorized", - "schema": {} - }, - "404": { - "description": "Not Found", - "schema": {} - }, - "409": { - "description": "Conflict", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - } - }, - "/users/{userID}/": { - "get": { - "description": "Retrieves a user", - "produces": [ - "application/json" - ], - "tags": [ - "user" - ], - "summary": "Retrieve a user", - "operationId": "get-user", - "parameters": [ - { - "type": "string", - "description": "User ID", - "name": "userID", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/models.User" - } - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "401": { - "description": "Unauthorized", - "schema": {} - }, - "404": { - "description": "Not Found", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - }, - "delete": { - "description": "Deletes a user", - "produces": [ - "application/json" - ], - "tags": [ - "user" - ], - "summary": "Delete a user", - "operationId": "delete-user", - "parameters": [ - { - "type": "string", - "description": "User ID", - "name": "userID", - "in": "path", - "required": true - } - ], - "responses": { - "204": { - "description": "No Content", - "schema": { - "type": "string" - } - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "401": { - "description": "Unauthorized", - "schema": {} - }, - "404": { - "description": "Not Found", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - }, - "patch": { - "description": "Updates a user", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "user" - ], - "summary": "Update a user", - "operationId": "update-user", - "parameters": [ - { - "type": "string", - "description": "User ID", - "name": "userID", - "in": "path", - "required": true - }, - { - "description": "User Body", - "name": "userBody", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/models.UpdateUserRequestBody" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/models.User" - } - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "401": { - "description": "Unauthorized", - "schema": {} - }, - "404": { - "description": "Not Found", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - } - }, - "/users/{userID}/follower/": { - "get": { - "description": "Retrieves all clubs a user is following", - "produces": [ - "application/json" - ], - "tags": [ - "user-follower" - ], - "summary": "Retrieve all clubs a user is following", - "operationId": "get-following", - "parameters": [ - { - "type": "string", - "description": "User ID", - "name": "userID", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/models.Club" - } - } - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "401": { - "description": "Unauthorized", - "schema": {} - }, - "404": { - "description": "Not Found", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - } - }, - "/users/{userID}/follower/{clubID}/": { - "post": { - "description": "Follow a club", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "user-follower" - ], - "summary": "Follow a club", - "operationId": "create-following", - "parameters": [ - { - "type": "string", - "description": "User ID", - "name": "userID", - "in": "path", - "required": true - }, - { - "type": "string", - "description": "Club ID", - "name": "clubID", - "in": "path", - "required": true - } - ], - "responses": { - "201": { - "description": "Created", - "schema": { - "$ref": "#/definitions/utilities.SuccessResponse" - } - }, - "401": { - "description": "Unauthorized", - "schema": {} - }, - "404": { - "description": "Not Found", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - }, - "delete": { - "description": "Unfollow a club", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "user-follower" - ], - "summary": "Unfollow a club", - "operationId": "delete-following", - "parameters": [ - { - "type": "string", - "description": "User ID", - "name": "userID", - "in": "path", - "required": true - }, - { - "type": "string", - "description": "Club ID", - "name": "clubID", - "in": "path", - "required": true - } - ], - "responses": { - "204": { - "description": "No Content", - "schema": { - "$ref": "#/definitions/utilities.SuccessResponse" - } - }, - "401": { - "description": "Unauthorized", - "schema": {} - }, - "404": { - "description": "Not Found", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - } - }, - "/users/{userID}/member/": { - "get": { - "description": "Retrieves all clubs a user is a member of", - "produces": [ - "application/json" - ], - "tags": [ - "user-member" - ], - "summary": "Retrieve all clubs a user is a member of", - "operationId": "get-membership", - "parameters": [ - { - "type": "string", - "description": "User ID", - "name": "userID", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/models.Club" - } - } - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "401": { - "description": "Unauthorized", - "schema": {} - }, - "404": { - "description": "Not Found", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - } - }, - "/users/{userID}/password": { - "patch": { - "description": "Updates a user's password", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "user" - ], - "summary": "Update a user's password", - "operationId": "update-password", - "parameters": [ - { - "type": "string", - "description": "User ID", - "name": "userID", - "in": "path", - "required": true - }, - { - "description": "Password Body", - "name": "passwordBody", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/models.UpdatePasswordRequestBody" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "string" - } - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "401": { - "description": "Unauthorized", - "schema": {} - }, - "404": { - "description": "Not Found", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - } - }, - "/users/{userID}/tags/": { - "get": { - "description": "Retrieves all tags associated with a user", - "produces": [ - "application/json" - ], - "tags": [ - "user-tag" - ], - "summary": "Retrieve all tags for a user", - "operationId": "get-tags-by-user", - "parameters": [ - { - "type": "string", - "description": "User ID", - "name": "userID", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/models.Tag" - } - } - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "401": { - "description": "Unauthorized", - "schema": {} - }, - "404": { - "description": "Not Found", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - }, - "post": { - "description": "Creates tags for a user", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "user-tag" - ], - "summary": "Create user tags", - "operationId": "create-user-tags", - "parameters": [ - { - "type": "string", - "description": "User ID", - "name": "userID", - "in": "path", - "required": true - }, - { - "description": "User Tags Body", - "name": "userTagsBody", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/tag.CreateUserTagsBody" - } - } - ], - "responses": { - "201": { - "description": "Created", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/models.Tag" - } - } - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "401": { - "description": "Unauthorized", - "schema": {} - }, - "404": { - "description": "Not Found", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - }, - "delete": { - "description": "Creates tags for a user", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "user-tag" - ], - "summary": "Create user tags", - "operationId": "create-user-tags", - "parameters": [ - { - "type": "string", - "description": "User ID", - "name": "userID", - "in": "path", - "required": true - } - ], - "responses": { - "201": { - "description": "Created" - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "401": { - "description": "Unauthorized", - "schema": {} - }, - "404": { - "description": "Not Found", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } + "/users/{userID}/follower/": { + "get": { + "description": "Retrieves all clubs a user is following", + "produces": ["application/json"], + "tags": ["user-follower"], + "summary": "Retrieve all clubs a user is following", + "operationId": "get-following", + "parameters": [ + { + "type": "string", + "description": "User ID", + "name": "userID", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/models.Club" + } } + }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "401": { + "description": "Unauthorized", + "schema": {} + }, + "404": { + "description": "Not Found", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} + } } + } }, - "definitions": { - "models.Category": { - "type": "object", - "required": [ - "name" - ], - "properties": { - "created_at": { - "type": "string", - "example": "2023-09-20T16:34:50Z" - }, - "id": { - "type": "string", - "example": "123e4567-e89b-12d3-a456-426614174000" - }, - "name": { - "type": "string", - "maxLength": 255 - }, - "updated_at": { - "type": "string", - "example": "2023-09-20T16:34:50Z" - } - } - }, - "models.CategoryRequestBody": { - "type": "object", - "required": [ - "name" - ], - "properties": { - "name": { - "type": "string", - "maxLength": 255 - } - } - }, - "models.Club": { - "type": "object", - "required": [ - "application_link", - "description", - "is_recruiting", - "name", - "num_members", - "preview", - "recruitment_cycle", - "recruitment_type" - ], - "properties": { - "application_link": { - "type": "string", - "maxLength": 255 - }, - "created_at": { - "type": "string", - "example": "2023-09-20T16:34:50Z" - }, - "description": { - "type": "string", - "maxLength": 255 - }, - "id": { - "type": "string", - "example": "123e4567-e89b-12d3-a456-426614174000" - }, - "is_recruiting": { - "type": "boolean" - }, - "logo": { - "type": "string", - "maxLength": 255 - }, - "name": { - "type": "string", - "maxLength": 255 - }, - "num_members": { - "type": "integer", - "minimum": 1 - }, - "one_word_to_describe_us": { - "type": "string", - "maxLength": 255 - }, - "preview": { - "type": "string", - "maxLength": 255 - }, - "recruitment_cycle": { - "maxLength": 255, - "enum": [ - "fall", - "spring", - "fallSpring", - "always" - ], - "allOf": [ - { - "$ref": "#/definitions/models.RecruitmentCycle" - } - ] - }, - "recruitment_type": { - "maxLength": 255, - "enum": [ - "unrestricted", - "tryout", - "application" - ], - "allOf": [ - { - "$ref": "#/definitions/models.RecruitmentType" - } - ] - }, - "updated_at": { - "type": "string", - "example": "2023-09-20T16:34:50Z" - }, - "weekly_time_commitment": { - "type": "integer", - "minimum": 1 - } - } - }, - "models.College": { + "/users/{userID}/follower/{clubID}/": { + "post": { + "description": "Follow a club", + "consumes": ["application/json"], + "produces": ["application/json"], + "tags": ["user-follower"], + "summary": "Follow a club", + "operationId": "create-following", + "parameters": [ + { + "type": "string", + "description": "User ID", + "name": "userID", + "in": "path", + "required": true + }, + { "type": "string", - "enum": [ - "CAMD", - "DMSB", - "KCCS", - "CE", - "BCHS", - "SL", - "CPS", - "CS", - "CSSH" - ], - "x-enum-comments": { - "BCHS": "Bouvé College of Health Sciences", - "CAMD": "College of Arts, Media and Design", - "CE": "College of Engineering", - "CPS": "College of Professional Studies", - "CS": "College of Science", - "CSSH": "College of Social Sciences and Humanities", - "DMSB": "D'Amore-McKim School of Business", - "KCCS": "Khoury College of Computer Sciences", - "SL": "School of Law" - }, - "x-enum-varnames": [ - "CAMD", - "DMSB", - "KCCS", - "CE", - "BCHS", - "SL", - "CPS", - "CS", - "CSSH" - ] - }, - "models.Contact": { - "type": "object", - "required": [ - "content", - "type" - ], - "properties": { - "content": { - "type": "string", - "maxLength": 255 - }, - "created_at": { - "type": "string", - "example": "2023-09-20T16:34:50Z" - }, - "id": { - "type": "string", - "example": "123e4567-e89b-12d3-a456-426614174000" - }, - "type": { - "maxLength": 255, - "enum": [ - "facebook", - "instagram", - "x", - "linkedin", - "youtube", - "github", - "slack", - "discord", - "email", - "customSite" - ], - "allOf": [ - { - "$ref": "#/definitions/models.ContactType" - } - ] - }, - "updated_at": { - "type": "string", - "example": "2023-09-20T16:34:50Z" - } - } - }, - "models.ContactType": { + "description": "Club ID", + "name": "clubID", + "in": "path", + "required": true + } + ], + "responses": { + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/utilities.SuccessResponse" + } + }, + "401": { + "description": "Unauthorized", + "schema": {} + }, + "404": { + "description": "Not Found", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} + } + } + }, + "delete": { + "description": "Unfollow a club", + "consumes": ["application/json"], + "produces": ["application/json"], + "tags": ["user-follower"], + "summary": "Unfollow a club", + "operationId": "delete-following", + "parameters": [ + { "type": "string", - "enum": [ - "facebook", - "instagram", - "x", - "linkedin", - "youtube", - "github", - "slack", - "discord", - "email", - "customSite" - ], - "x-enum-varnames": [ - "Facebook", - "Instagram", - "X", - "LinkedIn", - "YouTube", - "GitHub", - "Slack", - "Discord", - "Email", - "CustomSite" - ] - }, - "models.CreateClubRequestBody": { - "type": "object", - "required": [ - "application_link", - "description", - "is_recruiting", - "name", - "preview", - "recruitment_cycle", - "recruitment_type", - "user_id" - ], - "properties": { - "application_link": { - "type": "string", - "maxLength": 255 - }, - "description": { - "type": "string", - "maxLength": 255 - }, - "is_recruiting": { - "type": "boolean" - }, - "logo": { - "type": "string", - "maxLength": 255 - }, - "name": { - "type": "string", - "maxLength": 255 - }, - "one_word_to_describe_us": { - "type": "string", - "maxLength": 255 - }, - "preview": { - "type": "string", - "maxLength": 255 - }, - "recruitment_cycle": { - "maxLength": 255, - "enum": [ - "fall", - "spring", - "fallSpring", - "always" - ], - "allOf": [ - { - "$ref": "#/definitions/models.RecruitmentCycle" - } - ] - }, - "recruitment_type": { - "maxLength": 255, - "enum": [ - "unrestricted", - "tryout", - "application" - ], - "allOf": [ - { - "$ref": "#/definitions/models.RecruitmentType" - } - ] - }, - "user_id": { - "type": "string" - }, - "weekly_time_commitment": { - "type": "integer", - "minimum": 1 - } - } - }, - "models.CreateClubTagsRequestBody": { - "type": "object", - "required": [ - "tags" - ], - "properties": { - "tags": { - "type": "array", - "items": { - "type": "string" - } - } - } - }, - "models.CreateEventRequestBody": { - "type": "object", - "required": [ - "content", - "end_time", - "event_type", - "host", - "is_recurring", - "location", - "name", - "preview", - "start_time" - ], - "properties": { - "content": { - "type": "string", - "maxLength": 255 - }, - "end_time": { - "type": "string" - }, - "event_type": { - "maxLength": 255, - "enum": [ - "open", - "membersOnly" - ], - "allOf": [ - { - "$ref": "#/definitions/models.EventType" - } - ] - }, - "host": { - "description": "TODO club/tag/notification logic", - "type": "string" - }, - "is_recurring": { - "type": "boolean" - }, - "location": { - "type": "string", - "maxLength": 255 - }, - "name": { - "type": "string", - "maxLength": 255 - }, - "preview": { - "type": "string", - "maxLength": 255 - }, - "series": { - "description": "TODO validate if isRecurring, then series is required", - "allOf": [ - { - "$ref": "#/definitions/models.CreateSeriesRequestBody" - } - ] - }, - "start_time": { - "type": "string" - } - } - }, - "models.CreateFileRequestBody": { - "type": "object", - "required": [ - "owner_id", - "owner_type" - ], - "properties": { - "owner_id": { - "type": "string" - }, - "owner_type": { - "type": "string", - "maxLength": 255 - } - } - }, - "models.CreateSeriesRequestBody": { - "type": "object", - "required": [ - "max_occurrences", - "recurring_type" - ], - "properties": { - "max_occurrences": { - "type": "integer", - "minimum": 2 - }, - "recurring_type": { - "maxLength": 255, - "enum": [ - "daily", - "weekly", - "monthly" - ], - "allOf": [ - { - "$ref": "#/definitions/models.RecurringType" - } - ] - } - } - }, - "models.CreateTagRequestBody": { - "type": "object", - "required": [ - "category_id", - "name" - ], - "properties": { - "category_id": { - "type": "string" - }, - "name": { - "type": "string", - "maxLength": 255 - } - } - }, - "models.CreateUserRequestBody": { - "type": "object", - "required": [ - "email", - "first_name", - "last_name", - "password" - ], - "properties": { - "college": { - "enum": [ - "CAMD", - "DMSB", - "KCCS", - "CE", - "BCHS", - "SL", - "CPS", - "CS", - "CSSH" - ], - "allOf": [ - { - "$ref": "#/definitions/models.College" - } - ] - }, - "email": { - "type": "string", - "maxLength": 255 - }, - "first_name": { - "type": "string", - "maxLength": 255 - }, - "graduation_cycle": { - "maxLength": 255, - "enum": [ - "december", - "may" - ], - "allOf": [ - { - "$ref": "#/definitions/models.GraduationCycle" - } - ] - }, - "graduation_year": { - "type": "integer" - }, - "last_name": { - "type": "string", - "maxLength": 255 - }, - "major0": { - "description": "Optional fields", - "maxLength": 255, - "enum": [ - "africanaStudies", - "americanSignLanguage", - "americanSignLanguage-EnglishInterpreting", - "appliedPhysics", - "architecturalStudies", - "architecture", - "art:ArtVisualStudies", - "behavioralNeuroscience", - "biochemistry", - "bioengineering", - "biology", - "biomedicalPhysics", - "businessAdministration", - "businessAdministration:Accounting", - "businessAdministration:AccountingAndAdvisoryServices", - "businessAdministration:BrandManagement", - "businessAdministration:BusinessAnalytics", - "businessAdministration:CorporateInnovation", - "businessAdministration:EntrepreneurialStartups", - "businessAdministration:FamilyBusiness", - "businessAdministration:Finance", - "businessAdministration:Fintech", - "businessAdministration:HealthcareManagementAndConsulting", - "businessAdministration:Management", - "businessAdministration:ManagementInformationSystems", - "businessAdministration:Marketing", - "businessAdministration:MarketingAnalytics", - "businessAdministration:SocialInnovationAndEntrepreneurship", - "businessAdministration:SupplyChainManagement", - "cellAndMolecularBiology", - "chemicalEngineering", - "chemistry", - "civilEngineering", - "communicationStudies", - "computerEngineering", - "computerScience", - "computingAndLaw", - "criminologyAndCriminalJustice", - "culturalAnthropology", - "cybersecurity", - "dataScience", - "design", - "economics", - "electricalEngineering", - "english", - "environmentalAndSustainabilityStudies", - "environmentalEngineering", - "environmentalScience", - "environmentalStudies", - "gameArtAndAnimation", - "gameDesign", - "globalAsianStudies", - "healthScience", - "history", - "historyCultureAndLaw", - "humanServices", - "industrialEngineering", - "internationalAffairs", - "internationalBusiness", - "internationalBusiness:Accounting", - "internationalBusiness:AccountingAndAdvisoryServices", - "internationalBusiness:BrandManagement", - "internationalBusiness:BusinessAnalytics", - "internationalBusiness:CorporateInnovation", - "internationalBusiness:EntrepreneurialStartups", - "internationalBusiness:FamilyBusiness", - "internationalBusiness:Finance", - "internationalBusiness:Fintech", - "internationalBusiness:HealthcareManagementAndConsulting", - "internationalBusiness:Management", - "internationalBusiness:ManagementInformationSystems", - "internationalBusiness:Marketing", - "internationalBusiness:MarketingAnalytics", - "internationalBusiness:SocialInnovationAndEntrepreneurship", - "internationalBusiness:SupplyChainManagement", - "journalism", - "landscapeArchitecture", - "linguistics", - "marineBiology", - "mathematics", - "mechanicalEngineering", - "mediaAndScreenStudies", - "mediaArts", - "music", - "musicTechnology", - "nursing", - "pharmaceuticalSciences", - "pharmacy(PharmD)", - "philosophy", - "physics", - "politicalScience", - "politicsPhilosophyEconomics", - "psychology", - "publicHealth", - "publicRelations", - "religiousStudies", - "sociology", - "spanish", - "speechLanguagePathologyAndAudiology", - "theatre" - ], - "allOf": [ - { - "$ref": "#/definitions/models.Major" - } - ] - }, - "major1": { - "maxLength": 255, - "enum": [ - "africanaStudies", - "americanSignLanguage", - "americanSignLanguage-EnglishInterpreting", - "appliedPhysics", - "architecturalStudies", - "architecture", - "art:ArtVisualStudies", - "behavioralNeuroscience", - "biochemistry", - "bioengineering", - "biology", - "biomedicalPhysics", - "businessAdministration", - "businessAdministration:Accounting", - "businessAdministration:AccountingAndAdvisoryServices", - "businessAdministration:BrandManagement", - "businessAdministration:BusinessAnalytics", - "businessAdministration:CorporateInnovation", - "businessAdministration:EntrepreneurialStartups", - "businessAdministration:FamilyBusiness", - "businessAdministration:Finance", - "businessAdministration:Fintech", - "businessAdministration:HealthcareManagementAndConsulting", - "businessAdministration:Management", - "businessAdministration:ManagementInformationSystems", - "businessAdministration:Marketing", - "businessAdministration:MarketingAnalytics", - "businessAdministration:SocialInnovationAndEntrepreneurship", - "businessAdministration:SupplyChainManagement", - "cellAndMolecularBiology", - "chemicalEngineering", - "chemistry", - "civilEngineering", - "communicationStudies", - "computerEngineering", - "computerScience", - "computingAndLaw", - "criminologyAndCriminalJustice", - "culturalAnthropology", - "cybersecurity", - "dataScience", - "design", - "economics", - "electricalEngineering", - "english", - "environmentalAndSustainabilityStudies", - "environmentalEngineering", - "environmentalScience", - "environmentalStudies", - "gameArtAndAnimation", - "gameDesign", - "globalAsianStudies", - "healthScience", - "history", - "historyCultureAndLaw", - "humanServices", - "industrialEngineering", - "internationalAffairs", - "internationalBusiness", - "internationalBusiness:Accounting", - "internationalBusiness:AccountingAndAdvisoryServices", - "internationalBusiness:BrandManagement", - "internationalBusiness:BusinessAnalytics", - "internationalBusiness:CorporateInnovation", - "internationalBusiness:EntrepreneurialStartups", - "internationalBusiness:FamilyBusiness", - "internationalBusiness:Finance", - "internationalBusiness:Fintech", - "internationalBusiness:HealthcareManagementAndConsulting", - "internationalBusiness:Management", - "internationalBusiness:ManagementInformationSystems", - "internationalBusiness:Marketing", - "internationalBusiness:MarketingAnalytics", - "internationalBusiness:SocialInnovationAndEntrepreneurship", - "internationalBusiness:SupplyChainManagement", - "journalism", - "landscapeArchitecture", - "linguistics", - "marineBiology", - "mathematics", - "mechanicalEngineering", - "mediaAndScreenStudies", - "mediaArts", - "music", - "musicTechnology", - "nursing", - "pharmaceuticalSciences", - "pharmacy(PharmD)", - "philosophy", - "physics", - "politicalScience", - "politicsPhilosophyEconomics", - "psychology", - "publicHealth", - "publicRelations", - "religiousStudies", - "sociology", - "spanish", - "speechLanguagePathologyAndAudiology", - "theatre" - ], - "allOf": [ - { - "$ref": "#/definitions/models.Major" - } - ] - }, - "major2": { - "maxLength": 255, - "enum": [ - "africanaStudies", - "americanSignLanguage", - "americanSignLanguage-EnglishInterpreting", - "appliedPhysics", - "architecturalStudies", - "architecture", - "art:ArtVisualStudies", - "behavioralNeuroscience", - "biochemistry", - "bioengineering", - "biology", - "biomedicalPhysics", - "businessAdministration", - "businessAdministration:Accounting", - "businessAdministration:AccountingAndAdvisoryServices", - "businessAdministration:BrandManagement", - "businessAdministration:BusinessAnalytics", - "businessAdministration:CorporateInnovation", - "businessAdministration:EntrepreneurialStartups", - "businessAdministration:FamilyBusiness", - "businessAdministration:Finance", - "businessAdministration:Fintech", - "businessAdministration:HealthcareManagementAndConsulting", - "businessAdministration:Management", - "businessAdministration:ManagementInformationSystems", - "businessAdministration:Marketing", - "businessAdministration:MarketingAnalytics", - "businessAdministration:SocialInnovationAndEntrepreneurship", - "businessAdministration:SupplyChainManagement", - "cellAndMolecularBiology", - "chemicalEngineering", - "chemistry", - "civilEngineering", - "communicationStudies", - "computerEngineering", - "computerScience", - "computingAndLaw", - "criminologyAndCriminalJustice", - "culturalAnthropology", - "cybersecurity", - "dataScience", - "design", - "economics", - "electricalEngineering", - "english", - "environmentalAndSustainabilityStudies", - "environmentalEngineering", - "environmentalScience", - "environmentalStudies", - "gameArtAndAnimation", - "gameDesign", - "globalAsianStudies", - "healthScience", - "history", - "historyCultureAndLaw", - "humanServices", - "industrialEngineering", - "internationalAffairs", - "internationalBusiness", - "internationalBusiness:Accounting", - "internationalBusiness:AccountingAndAdvisoryServices", - "internationalBusiness:BrandManagement", - "internationalBusiness:BusinessAnalytics", - "internationalBusiness:CorporateInnovation", - "internationalBusiness:EntrepreneurialStartups", - "internationalBusiness:FamilyBusiness", - "internationalBusiness:Finance", - "internationalBusiness:Fintech", - "internationalBusiness:HealthcareManagementAndConsulting", - "internationalBusiness:Management", - "internationalBusiness:ManagementInformationSystems", - "internationalBusiness:Marketing", - "internationalBusiness:MarketingAnalytics", - "internationalBusiness:SocialInnovationAndEntrepreneurship", - "internationalBusiness:SupplyChainManagement", - "journalism", - "landscapeArchitecture", - "linguistics", - "marineBiology", - "mathematics", - "mechanicalEngineering", - "mediaAndScreenStudies", - "mediaArts", - "music", - "musicTechnology", - "nursing", - "pharmaceuticalSciences", - "pharmacy(PharmD)", - "philosophy", - "physics", - "politicalScience", - "politicsPhilosophyEconomics", - "psychology", - "publicHealth", - "publicRelations", - "religiousStudies", - "sociology", - "spanish", - "speechLanguagePathologyAndAudiology", - "theatre" - ], - "allOf": [ - { - "$ref": "#/definitions/models.Major" - } - ] - }, - "password": { - "description": "MARK: must be validated manually", - "type": "string", - "maxLength": 255 - } - } - }, - "models.Event": { - "type": "object", - "required": [ - "content", - "end_time", - "event_type", - "location", - "name", - "preview", - "start_time" - ], - "properties": { - "content": { - "type": "string", - "maxLength": 255 - }, - "created_at": { - "type": "string", - "example": "2023-09-20T16:34:50Z" - }, - "end_time": { - "type": "string" - }, - "event_type": { - "maxLength": 255, - "enum": [ - "open", - "membersOnly" - ], - "allOf": [ - { - "$ref": "#/definitions/models.EventType" - } - ] - }, - "host": { - "type": "string" - }, - "id": { - "type": "string", - "example": "123e4567-e89b-12d3-a456-426614174000" - }, - "is_recurring": { - "type": "boolean" - }, - "location": { - "type": "string", - "maxLength": 255 - }, - "meeting_link": { - "type": "string" - }, - "name": { - "type": "string", - "maxLength": 255 - }, - "preview": { - "type": "string", - "maxLength": 255 - }, - "start_time": { - "type": "string" - }, - "updated_at": { - "type": "string", - "example": "2023-09-20T16:34:50Z" - } - } - }, - "models.EventType": { + "description": "User ID", + "name": "userID", + "in": "path", + "required": true + }, + { "type": "string", - "enum": [ - "open", - "membersOnly" - ], - "x-enum-varnames": [ - "Open", - "MembersOnly" - ] - }, - "models.File": { - "type": "object", - "required": [ - "file_name", - "file_size", - "file_type", - "file_url", - "object_key" - ], - "properties": { - "created_at": { - "type": "string", - "example": "2023-09-20T16:34:50Z" - }, - "file_name": { - "type": "string", - "maxLength": 255 - }, - "file_size": { - "type": "integer", - "minimum": 1 - }, - "file_type": { - "type": "string", - "maxLength": 255 - }, - "file_url": { - "type": "string", - "maxLength": 255 - }, - "id": { - "type": "string", - "example": "123e4567-e89b-12d3-a456-426614174000" - }, - "object_key": { - "type": "string", - "maxLength": 255 - }, - "updated_at": { - "type": "string", - "example": "2023-09-20T16:34:50Z" - } - } - }, - "models.GraduationCycle": { + "description": "Club ID", + "name": "clubID", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "description": "No Content", + "schema": { + "$ref": "#/definitions/utilities.SuccessResponse" + } + }, + "401": { + "description": "Unauthorized", + "schema": {} + }, + "404": { + "description": "Not Found", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} + } + } + } + }, + "/users/{userID}/member/": { + "get": { + "description": "Retrieves all clubs a user is a member of", + "produces": ["application/json"], + "tags": ["user-member"], + "summary": "Retrieve all clubs a user is a member of", + "operationId": "get-membership", + "parameters": [ + { "type": "string", - "enum": [ - "december", - "may" - ], - "x-enum-varnames": [ - "December", - "May" - ] - }, - "models.LoginUserResponseBody": { - "type": "object", - "required": [ - "email", - "password" - ], - "properties": { - "email": { - "type": "string" - }, - "password": { - "description": "MARK: must be validated manually", - "type": "string", - "maxLength": 255 - } - } - }, - "models.Major": { + "description": "User ID", + "name": "userID", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/models.Club" + } + } + }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "401": { + "description": "Unauthorized", + "schema": {} + }, + "404": { + "description": "Not Found", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} + } + } + } + }, + "/users/{userID}/password": { + "patch": { + "description": "Updates a user's password", + "consumes": ["application/json"], + "produces": ["application/json"], + "tags": ["user"], + "summary": "Update a user's password", + "operationId": "update-password", + "parameters": [ + { "type": "string", - "enum": [ - "africanaStudies", - "americanSignLanguage", - "americanSignLanguage-EnglishInterpreting", - "appliedPhysics", - "architecturalStudies", - "architecture", - "art:ArtVisualStudies", - "behavioralNeuroscience", - "biochemistry", - "bioengineering", - "biology", - "biomedicalPhysics", - "businessAdministration", - "businessAdministration:Accounting", - "businessAdministration:AccountingAndAdvisoryServices", - "businessAdministration:BrandManagement", - "businessAdministration:BusinessAnalytics", - "businessAdministration:CorporateInnovation", - "businessAdministration:EntrepreneurialStartups", - "businessAdministration:FamilyBusiness", - "businessAdministration:Finance", - "businessAdministration:Fintech", - "businessAdministration:HealthcareManagementAndConsulting", - "businessAdministration:Management", - "businessAdministration:ManagementInformationSystems", - "businessAdministration:Marketing", - "businessAdministration:MarketingAnalytics", - "businessAdministration:SocialInnovationAndEntrepreneurship", - "businessAdministration:SupplyChainManagement", - "cellAndMolecularBiology", - "chemicalEngineering", - "chemistry", - "civilEngineering", - "communicationStudies", - "computerEngineering", - "computerScience", - "computingAndLaw", - "criminologyAndCriminalJustice", - "culturalAnthropology", - "cybersecurity", - "dataScience", - "design", - "economics", - "electricalEngineering", - "english", - "environmentalAndSustainabilityStudies", - "environmentalEngineering", - "environmentalScience", - "environmentalStudies", - "gameArtAndAnimation", - "gameDesign", - "globalAsianStudies", - "healthScience", - "history", - "historyCultureAndLaw", - "humanServices", - "industrialEngineering", - "internationalAffairs", - "internationalBusiness", - "internationalBusiness:Accounting", - "internationalBusiness:AccountingAndAdvisoryServices", - "internationalBusiness:BrandManagement", - "internationalBusiness:BusinessAnalytics", - "internationalBusiness:CorporateInnovation", - "internationalBusiness:EntrepreneurialStartups", - "internationalBusiness:FamilyBusiness", - "internationalBusiness:Finance", - "internationalBusiness:Fintech", - "internationalBusiness:HealthcareManagementAndConsulting", - "internationalBusiness:Management", - "internationalBusiness:ManagementInformationSystems", - "internationalBusiness:Marketing", - "internationalBusiness:MarketingAnalytics", - "internationalBusiness:SocialInnovationAndEntrepreneurship", - "internationalBusiness:SupplyChainManagement", - "journalism", - "landscapeArchitecture", - "linguistics", - "marineBiology", - "mathematics", - "mechanicalEngineering", - "mediaAndScreenStudies", - "mediaArts", - "music", - "musicTechnology", - "nursing", - "pharmaceuticalSciences", - "pharmacy(PharmD)", - "philosophy", - "physics", - "politicalScience", - "politicsPhilosophyEconomics", - "psychology", - "publicHealth", - "publicRelations", - "religiousStudies", - "sociology", - "spanish", - "speechLanguagePathologyAndAudiology", - "theatre" - ], - "x-enum-varnames": [ - "AfricanaStudies", - "AmericanSignLanguage", - "AmericanSignLanguageEnglishInterpreting", - "AppliedPhysics", - "ArchitecturalStudies", - "Architecture", - "ArtArtVisualStudies", - "BehavioralNeuroscience", - "Biochemistry", - "Bioengineering", - "Biology", - "BiomedicalPhysics", - "BusinessAdministration", - "BusinessAdministrationAccounting", - "BusinessAdministrationAccountingAndAdvisoryServices", - "BusinessAdministrationBrandManagement", - "BusinessAdministrationBusinessAnalytics", - "BusinessAdministrationCorporateInnovation", - "BusinessAdministrationEntrepreneurialStartups", - "BusinessAdministrationFamilyBusiness", - "BusinessAdministrationFinance", - "BusinessAdministrationFintech", - "BusinessAdministrationHealthcareManagementAndConsulting", - "BusinessAdministrationManagement", - "BusinessAdministrationManagementInformationSystems", - "BusinessAdministrationMarketing", - "BusinessAdministrationMarketingAnalytics", - "BusinessAdministrationSocialInnovationAndEntrepreneurship", - "BusinessAdministrationSupplyChainManagement", - "CellAndMolecularBiology", - "ChemicalEngineering", - "Chemistry", - "CivilEngineering", - "CommunicationStudies", - "ComputerEngineering", - "ComputerScience", - "ComputingAndLaw", - "CriminologyAndCriminalJustice", - "CulturalAnthropology", - "Cybersecurity", - "DataScience", - "Design", - "Economics", - "ElectricalEngineering", - "English", - "EnvironmentalAndSustainabilityStudies", - "EnvironmentalEngineering", - "EnvironmentalScience", - "EnvironmentalStudies", - "GameArtAndAnimation", - "GameDesign", - "GlobalAsianStudies", - "HealthScience", - "History", - "HistoryCultureAndLaw", - "HumanServices", - "IndustrialEngineering", - "InternationalAffairs", - "InternationalBusiness", - "InternationalBusinessAccounting", - "InternationalBusinessAccountingAndAdvisoryServices", - "InternationalBusinessBrandManagement", - "InternationalBusinessBusinessAnalytics", - "InternationalBusinessCorporateInnovation", - "InternationalBusinessEntrepreneurialStartups", - "InternationalBusinessFamilyBusiness", - "InternationalBusinessFinance", - "InternationalBusinessFintech", - "InternationalBusinessHealthcareManagementAndConsulting", - "InternationalBusinessManagement", - "InternationalBusinessManagementInformationSystems", - "InternationalBusinessMarketing", - "InternationalBusinessMarketingAnalytics", - "InternationalBusinessSocialInnovationAndEntrepreneurship", - "InternationalBusinessSupplyChainManagement", - "Journalism", - "LandscapeArchitecture", - "Linguistics", - "MarineBiology", - "Mathematics", - "MechanicalEngineering", - "MediaAndScreenStudies", - "MediaArts", - "Music", - "MusicTechnology", - "Nursing", - "PharmaceuticalSciences", - "PharmacyPharmD", - "Philosophy", - "Physics", - "PoliticalScience", - "PoliticsPhilosophyEconomics", - "Psychology", - "PublicHealth", - "PublicRelations", - "ReligiousStudies", - "Sociology", - "Spanish", - "SpeechLanguagePathologyAndAudiology", - "Theatre" - ] - }, - "models.PointOfContact": { - "type": "object", - "required": [ - "email", - "name", - "position" - ], - "properties": { - "created_at": { - "type": "string", - "example": "2023-09-20T16:34:50Z" - }, - "email": { - "type": "string", - "maxLength": 255 - }, - "id": { - "type": "string", - "example": "123e4567-e89b-12d3-a456-426614174000" - }, - "name": { - "type": "string", - "maxLength": 255 - }, - "photo_file": { - "$ref": "#/definitions/models.File" - }, - "position": { - "type": "string", - "maxLength": 255 - }, - "updated_at": { - "type": "string", - "example": "2023-09-20T16:34:50Z" - } - } - }, - "models.PutContactRequestBody": { - "type": "object", - "required": [ - "content", - "type" - ], - "properties": { - "content": { - "type": "string", - "maxLength": 255 - }, - "type": { - "maxLength": 255, - "enum": [ - "facebook", - "instagram", - "x", - "linkedin", - "youtube", - "github", - "slack", - "discord", - "email", - "customSite" - ], - "allOf": [ - { - "$ref": "#/definitions/models.ContactType" - } - ] - } - } - }, - "models.RecruitmentCycle": { + "description": "User ID", + "name": "userID", + "in": "path", + "required": true + }, + { + "description": "Password Body", + "name": "passwordBody", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/models.UpdatePasswordRequestBody" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "string" + } + }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "401": { + "description": "Unauthorized", + "schema": {} + }, + "404": { + "description": "Not Found", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} + } + } + } + }, + "/users/{userID}/tags/": { + "get": { + "description": "Retrieves all tags associated with a user", + "produces": ["application/json"], + "tags": ["user-tag"], + "summary": "Retrieve all tags for a user", + "operationId": "get-tags-by-user", + "parameters": [ + { "type": "string", - "enum": [ - "fall", - "spring", - "fallSpring", - "always" - ], - "x-enum-varnames": [ - "Fall", - "Spring", - "FallSpring", - "Always" - ] - }, - "models.RecruitmentType": { + "description": "User ID", + "name": "userID", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/models.Tag" + } + } + }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "401": { + "description": "Unauthorized", + "schema": {} + }, + "404": { + "description": "Not Found", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} + } + } + }, + "post": { + "description": "Creates tags for a user", + "consumes": ["application/json"], + "produces": ["application/json"], + "tags": ["user-tag"], + "summary": "Create user tags", + "operationId": "create-user-tags", + "parameters": [ + { "type": "string", - "enum": [ - "unrestricted", - "tryout", - "application" - ], - "x-enum-varnames": [ - "Unrestricted", - "Tryout", - "Application" - ] - }, - "models.RecurringType": { + "description": "User ID", + "name": "userID", + "in": "path", + "required": true + }, + { + "description": "User Tags Body", + "name": "userTagsBody", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/tag.CreateUserTagsBody" + } + } + ], + "responses": { + "201": { + "description": "Created", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/models.Tag" + } + } + }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "401": { + "description": "Unauthorized", + "schema": {} + }, + "404": { + "description": "Not Found", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} + } + } + }, + "delete": { + "description": "Creates tags for a user", + "consumes": ["application/json"], + "produces": ["application/json"], + "tags": ["user-tag"], + "summary": "Create user tags", + "operationId": "create-user-tags", + "parameters": [ + { "type": "string", - "enum": [ - "daily", - "weekly", - "monthly" - ], - "x-enum-varnames": [ - "Daily", - "Weekly", - "Monthly" - ] - }, - "models.Series": { - "type": "object", - "properties": { - "created_at": { - "type": "string", - "example": "2023-09-20T16:34:50Z" - }, - "events": { - "type": "array", - "items": { - "$ref": "#/definitions/models.Event" - } - }, - "id": { - "type": "string", - "example": "123e4567-e89b-12d3-a456-426614174000" - }, - "max_occurrences": { - "type": "integer", - "minimum": 1 - }, - "recurring_type": { - "maxLength": 255, - "allOf": [ - { - "$ref": "#/definitions/models.RecurringType" - } - ] - }, - "updated_at": { - "type": "string", - "example": "2023-09-20T16:34:50Z" - } - } - }, - "models.Tag": { - "type": "object", - "required": [ - "category_id", - "name" - ], - "properties": { - "category_id": { - "type": "string" - }, - "created_at": { - "type": "string", - "example": "2023-09-20T16:34:50Z" - }, - "id": { - "type": "string", - "example": "123e4567-e89b-12d3-a456-426614174000" - }, - "name": { - "type": "string", - "maxLength": 255 - }, - "updated_at": { - "type": "string", - "example": "2023-09-20T16:34:50Z" - } - } - }, - "models.UpdateClubRequestBody": { - "type": "object", - "required": [ - "application_link", - "recruitment_cycle", - "recruitment_type" - ], - "properties": { - "application_link": { - "type": "string", - "maxLength": 255 - }, - "description": { - "type": "string", - "maxLength": 255 - }, - "is_recruiting": { - "type": "boolean" - }, - "logo": { - "type": "string", - "maxLength": 255 - }, - "name": { - "type": "string", - "maxLength": 255 - }, - "one_word_to_describe_us": { - "type": "string", - "maxLength": 255 - }, - "preview": { - "type": "string", - "maxLength": 255 - }, - "recruitment_cycle": { - "maxLength": 255, - "enum": [ - "fall", - "spring", - "fallSpring", - "always" - ], - "allOf": [ - { - "$ref": "#/definitions/models.RecruitmentCycle" - } - ] - }, - "recruitment_type": { - "maxLength": 255, - "enum": [ - "unrestricted", - "tryout", - "application" - ], - "allOf": [ - { - "$ref": "#/definitions/models.RecruitmentType" - } - ] - }, - "weekly_time_commitment": { - "type": "integer", - "minimum": 1 - } - } - }, - "models.UpdateEventRequestBody": { - "type": "object", - "properties": { - "content": { - "type": "string", - "maxLength": 255 - }, - "end_time": { - "type": "string" - }, - "event_type": { - "maxLength": 255, - "enum": [ - "open", - "membersOnly" - ], - "allOf": [ - { - "$ref": "#/definitions/models.EventType" - } - ] - }, - "host": { - "type": "string" - }, - "location": { - "type": "string", - "maxLength": 255 - }, - "name": { - "type": "string", - "maxLength": 255 - }, - "preview": { - "type": "string", - "maxLength": 255 - }, - "start_time": { - "type": "string" - } - } - }, - "models.UpdatePasswordRequestBody": { - "type": "object", - "required": [ - "new_password", - "old_password" - ], - "properties": { - "new_password": { - "description": "MARK: must be validated manually", - "type": "string", - "maxLength": 255 - }, - "old_password": { - "description": "MARK: must be validated manually", - "type": "string", - "maxLength": 255 - } - } - }, - "models.UpdateSeriesRequestBody": { - "type": "object", - "properties": { - "event_details": { - "$ref": "#/definitions/models.UpdateEventRequestBody" - }, - "max_occurrences": { - "type": "integer", - "minimum": 2 - }, - "recurring_type": { - "maxLength": 255, - "enum": [ - "daily", - "weekly", - "monthly" - ], - "allOf": [ - { - "$ref": "#/definitions/models.RecurringType" - } - ] - } - } - }, - "models.UpdateTagRequestBody": { - "type": "object", - "properties": { - "category_id": { - "type": "string" - }, - "name": { - "type": "string", - "maxLength": 255 - } - } - }, - "models.UpdateUserRequestBody": { - "type": "object", - "properties": { - "college": { - "enum": [ - "CAMD", - "DMSB", - "KCCS", - "CE", - "BCHS", - "SL", - "CPS", - "CS", - "CSSH" - ], - "allOf": [ - { - "$ref": "#/definitions/models.College" - } - ] - }, - "first_name": { - "type": "string", - "maxLength": 255 - }, - "graduation_cycle": { - "maxLength": 255, - "enum": [ - "december", - "may" - ], - "allOf": [ - { - "$ref": "#/definitions/models.GraduationCycle" - } - ] - }, - "graduation_year": { - "type": "integer" - }, - "last_name": { - "type": "string", - "maxLength": 255 - }, - "major0": { - "maxLength": 255, - "enum": [ - "africanaStudies", - "americanSignLanguage", - "americanSignLanguage-EnglishInterpreting", - "appliedPhysics", - "architecturalStudies", - "architecture", - "art:ArtVisualStudies", - "behavioralNeuroscience", - "biochemistry", - "bioengineering", - "biology", - "biomedicalPhysics", - "businessAdministration", - "businessAdministration:Accounting", - "businessAdministration:AccountingAndAdvisoryServices", - "businessAdministration:BrandManagement", - "businessAdministration:BusinessAnalytics", - "businessAdministration:CorporateInnovation", - "businessAdministration:EntrepreneurialStartups", - "businessAdministration:FamilyBusiness", - "businessAdministration:Finance", - "businessAdministration:Fintech", - "businessAdministration:HealthcareManagementAndConsulting", - "businessAdministration:Management", - "businessAdministration:ManagementInformationSystems", - "businessAdministration:Marketing", - "businessAdministration:MarketingAnalytics", - "businessAdministration:SocialInnovationAndEntrepreneurship", - "businessAdministration:SupplyChainManagement", - "cellAndMolecularBiology", - "chemicalEngineering", - "chemistry", - "civilEngineering", - "communicationStudies", - "computerEngineering", - "computerScience", - "computingAndLaw", - "criminologyAndCriminalJustice", - "culturalAnthropology", - "cybersecurity", - "dataScience", - "design", - "economics", - "electricalEngineering", - "english", - "environmentalAndSustainabilityStudies", - "environmentalEngineering", - "environmentalScience", - "environmentalStudies", - "gameArtAndAnimation", - "gameDesign", - "globalAsianStudies", - "healthScience", - "history", - "historyCultureAndLaw", - "humanServices", - "industrialEngineering", - "internationalAffairs", - "internationalBusiness", - "internationalBusiness:Accounting", - "internationalBusiness:AccountingAndAdvisoryServices", - "internationalBusiness:BrandManagement", - "internationalBusiness:BusinessAnalytics", - "internationalBusiness:CorporateInnovation", - "internationalBusiness:EntrepreneurialStartups", - "internationalBusiness:FamilyBusiness", - "internationalBusiness:Finance", - "internationalBusiness:Fintech", - "internationalBusiness:HealthcareManagementAndConsulting", - "internationalBusiness:Management", - "internationalBusiness:ManagementInformationSystems", - "internationalBusiness:Marketing", - "internationalBusiness:MarketingAnalytics", - "internationalBusiness:SocialInnovationAndEntrepreneurship", - "internationalBusiness:SupplyChainManagement", - "journalism", - "landscapeArchitecture", - "linguistics", - "marineBiology", - "mathematics", - "mechanicalEngineering", - "mediaAndScreenStudies", - "mediaArts", - "music", - "musicTechnology", - "nursing", - "pharmaceuticalSciences", - "pharmacy(PharmD)", - "philosophy", - "physics", - "politicalScience", - "politicsPhilosophyEconomics", - "psychology", - "publicHealth", - "publicRelations", - "religiousStudies", - "sociology", - "spanish", - "speechLanguagePathologyAndAudiology", - "theatre" - ], - "allOf": [ - { - "$ref": "#/definitions/models.Major" - } - ] - }, - "major1": { - "maxLength": 255, - "enum": [ - "africanaStudies", - "americanSignLanguage", - "americanSignLanguage-EnglishInterpreting", - "appliedPhysics", - "architecturalStudies", - "architecture", - "art:ArtVisualStudies", - "behavioralNeuroscience", - "biochemistry", - "bioengineering", - "biology", - "biomedicalPhysics", - "businessAdministration", - "businessAdministration:Accounting", - "businessAdministration:AccountingAndAdvisoryServices", - "businessAdministration:BrandManagement", - "businessAdministration:BusinessAnalytics", - "businessAdministration:CorporateInnovation", - "businessAdministration:EntrepreneurialStartups", - "businessAdministration:FamilyBusiness", - "businessAdministration:Finance", - "businessAdministration:Fintech", - "businessAdministration:HealthcareManagementAndConsulting", - "businessAdministration:Management", - "businessAdministration:ManagementInformationSystems", - "businessAdministration:Marketing", - "businessAdministration:MarketingAnalytics", - "businessAdministration:SocialInnovationAndEntrepreneurship", - "businessAdministration:SupplyChainManagement", - "cellAndMolecularBiology", - "chemicalEngineering", - "chemistry", - "civilEngineering", - "communicationStudies", - "computerEngineering", - "computerScience", - "computingAndLaw", - "criminologyAndCriminalJustice", - "culturalAnthropology", - "cybersecurity", - "dataScience", - "design", - "economics", - "electricalEngineering", - "english", - "environmentalAndSustainabilityStudies", - "environmentalEngineering", - "environmentalScience", - "environmentalStudies", - "gameArtAndAnimation", - "gameDesign", - "globalAsianStudies", - "healthScience", - "history", - "historyCultureAndLaw", - "humanServices", - "industrialEngineering", - "internationalAffairs", - "internationalBusiness", - "internationalBusiness:Accounting", - "internationalBusiness:AccountingAndAdvisoryServices", - "internationalBusiness:BrandManagement", - "internationalBusiness:BusinessAnalytics", - "internationalBusiness:CorporateInnovation", - "internationalBusiness:EntrepreneurialStartups", - "internationalBusiness:FamilyBusiness", - "internationalBusiness:Finance", - "internationalBusiness:Fintech", - "internationalBusiness:HealthcareManagementAndConsulting", - "internationalBusiness:Management", - "internationalBusiness:ManagementInformationSystems", - "internationalBusiness:Marketing", - "internationalBusiness:MarketingAnalytics", - "internationalBusiness:SocialInnovationAndEntrepreneurship", - "internationalBusiness:SupplyChainManagement", - "journalism", - "landscapeArchitecture", - "linguistics", - "marineBiology", - "mathematics", - "mechanicalEngineering", - "mediaAndScreenStudies", - "mediaArts", - "music", - "musicTechnology", - "nursing", - "pharmaceuticalSciences", - "pharmacy(PharmD)", - "philosophy", - "physics", - "politicalScience", - "politicsPhilosophyEconomics", - "psychology", - "publicHealth", - "publicRelations", - "religiousStudies", - "sociology", - "spanish", - "speechLanguagePathologyAndAudiology", - "theatre" - ], - "allOf": [ - { - "$ref": "#/definitions/models.Major" - } - ] - }, - "major2": { - "maxLength": 255, - "enum": [ - "africanaStudies", - "americanSignLanguage", - "americanSignLanguage-EnglishInterpreting", - "appliedPhysics", - "architecturalStudies", - "architecture", - "art:ArtVisualStudies", - "behavioralNeuroscience", - "biochemistry", - "bioengineering", - "biology", - "biomedicalPhysics", - "businessAdministration", - "businessAdministration:Accounting", - "businessAdministration:AccountingAndAdvisoryServices", - "businessAdministration:BrandManagement", - "businessAdministration:BusinessAnalytics", - "businessAdministration:CorporateInnovation", - "businessAdministration:EntrepreneurialStartups", - "businessAdministration:FamilyBusiness", - "businessAdministration:Finance", - "businessAdministration:Fintech", - "businessAdministration:HealthcareManagementAndConsulting", - "businessAdministration:Management", - "businessAdministration:ManagementInformationSystems", - "businessAdministration:Marketing", - "businessAdministration:MarketingAnalytics", - "businessAdministration:SocialInnovationAndEntrepreneurship", - "businessAdministration:SupplyChainManagement", - "cellAndMolecularBiology", - "chemicalEngineering", - "chemistry", - "civilEngineering", - "communicationStudies", - "computerEngineering", - "computerScience", - "computingAndLaw", - "criminologyAndCriminalJustice", - "culturalAnthropology", - "cybersecurity", - "dataScience", - "design", - "economics", - "electricalEngineering", - "english", - "environmentalAndSustainabilityStudies", - "environmentalEngineering", - "environmentalScience", - "environmentalStudies", - "gameArtAndAnimation", - "gameDesign", - "globalAsianStudies", - "healthScience", - "history", - "historyCultureAndLaw", - "humanServices", - "industrialEngineering", - "internationalAffairs", - "internationalBusiness", - "internationalBusiness:Accounting", - "internationalBusiness:AccountingAndAdvisoryServices", - "internationalBusiness:BrandManagement", - "internationalBusiness:BusinessAnalytics", - "internationalBusiness:CorporateInnovation", - "internationalBusiness:EntrepreneurialStartups", - "internationalBusiness:FamilyBusiness", - "internationalBusiness:Finance", - "internationalBusiness:Fintech", - "internationalBusiness:HealthcareManagementAndConsulting", - "internationalBusiness:Management", - "internationalBusiness:ManagementInformationSystems", - "internationalBusiness:Marketing", - "internationalBusiness:MarketingAnalytics", - "internationalBusiness:SocialInnovationAndEntrepreneurship", - "internationalBusiness:SupplyChainManagement", - "journalism", - "landscapeArchitecture", - "linguistics", - "marineBiology", - "mathematics", - "mechanicalEngineering", - "mediaAndScreenStudies", - "mediaArts", - "music", - "musicTechnology", - "nursing", - "pharmaceuticalSciences", - "pharmacy(PharmD)", - "philosophy", - "physics", - "politicalScience", - "politicsPhilosophyEconomics", - "psychology", - "publicHealth", - "publicRelations", - "religiousStudies", - "sociology", - "spanish", - "speechLanguagePathologyAndAudiology", - "theatre" - ], - "allOf": [ - { - "$ref": "#/definitions/models.Major" - } - ] - } - } - }, - "models.User": { - "type": "object", - "required": [ - "college", - "email", - "first_name", - "graduation_cycle", - "graduation_year", - "last_name", - "major0", - "role" - ], - "properties": { - "college": { - "maxLength": 255, - "allOf": [ - { - "$ref": "#/definitions/models.College" - } - ] - }, - "created_at": { - "type": "string", - "example": "2023-09-20T16:34:50Z" - }, - "email": { - "type": "string", - "maxLength": 255 - }, - "first_name": { - "type": "string", - "maxLength": 255 - }, - "graduation_cycle": { - "maxLength": 255, - "enum": [ - "december", - "may" - ], - "allOf": [ - { - "$ref": "#/definitions/models.GraduationCycle" - } - ] - }, - "graduation_year": { - "type": "integer" - }, - "id": { - "type": "string", - "example": "123e4567-e89b-12d3-a456-426614174000" - }, - "is_verified": { - "type": "boolean" - }, - "last_name": { - "type": "string", - "maxLength": 255 - }, - "major0": { - "maxLength": 255, - "enum": [ - "africanaStudies", - "americanSignLanguage", - "americanSignLanguage-EnglishInterpreting", - "appliedPhysics", - "architecturalStudies", - "architecture", - "art:ArtVisualStudies", - "behavioralNeuroscience", - "biochemistry", - "bioengineering", - "biology", - "biomedicalPhysics", - "businessAdministration", - "businessAdministration:Accounting", - "businessAdministration:AccountingAndAdvisoryServices", - "businessAdministration:BrandManagement", - "businessAdministration:BusinessAnalytics", - "businessAdministration:CorporateInnovation", - "businessAdministration:EntrepreneurialStartups", - "businessAdministration:FamilyBusiness", - "businessAdministration:Finance", - "businessAdministration:Fintech", - "businessAdministration:HealthcareManagementAndConsulting", - "businessAdministration:Management", - "businessAdministration:ManagementInformationSystems", - "businessAdministration:Marketing", - "businessAdministration:MarketingAnalytics", - "businessAdministration:SocialInnovationAndEntrepreneurship", - "businessAdministration:SupplyChainManagement", - "cellAndMolecularBiology", - "chemicalEngineering", - "chemistry", - "civilEngineering", - "communicationStudies", - "computerEngineering", - "computerScience", - "computingAndLaw", - "criminologyAndCriminalJustice", - "culturalAnthropology", - "cybersecurity", - "dataScience", - "design", - "economics", - "electricalEngineering", - "english", - "environmentalAndSustainabilityStudies", - "environmentalEngineering", - "environmentalScience", - "environmentalStudies", - "gameArtAndAnimation", - "gameDesign", - "globalAsianStudies", - "healthScience", - "history", - "historyCultureAndLaw", - "humanServices", - "industrialEngineering", - "internationalAffairs", - "internationalBusiness", - "internationalBusiness:Accounting", - "internationalBusiness:AccountingAndAdvisoryServices", - "internationalBusiness:BrandManagement", - "internationalBusiness:BusinessAnalytics", - "internationalBusiness:CorporateInnovation", - "internationalBusiness:EntrepreneurialStartups", - "internationalBusiness:FamilyBusiness", - "internationalBusiness:Finance", - "internationalBusiness:Fintech", - "internationalBusiness:HealthcareManagementAndConsulting", - "internationalBusiness:Management", - "internationalBusiness:ManagementInformationSystems", - "internationalBusiness:Marketing", - "internationalBusiness:MarketingAnalytics", - "internationalBusiness:SocialInnovationAndEntrepreneurship", - "internationalBusiness:SupplyChainManagement", - "journalism", - "landscapeArchitecture", - "linguistics", - "marineBiology", - "mathematics", - "mechanicalEngineering", - "mediaAndScreenStudies", - "mediaArts", - "music", - "musicTechnology", - "nursing", - "pharmaceuticalSciences", - "pharmacy(PharmD)", - "philosophy", - "physics", - "politicalScience", - "politicsPhilosophyEconomics", - "psychology", - "publicHealth", - "publicRelations", - "religiousStudies", - "sociology", - "spanish", - "speechLanguagePathologyAndAudiology", - "theatre" - ], - "allOf": [ - { - "$ref": "#/definitions/models.Major" - } - ] - }, - "major1": { - "maxLength": 255, - "enum": [ - "africanaStudies", - "americanSignLanguage", - "americanSignLanguage-EnglishInterpreting", - "appliedPhysics", - "architecturalStudies", - "architecture", - "art:ArtVisualStudies", - "behavioralNeuroscience", - "biochemistry", - "bioengineering", - "biology", - "biomedicalPhysics", - "businessAdministration", - "businessAdministration:Accounting", - "businessAdministration:AccountingAndAdvisoryServices", - "businessAdministration:BrandManagement", - "businessAdministration:BusinessAnalytics", - "businessAdministration:CorporateInnovation", - "businessAdministration:EntrepreneurialStartups", - "businessAdministration:FamilyBusiness", - "businessAdministration:Finance", - "businessAdministration:Fintech", - "businessAdministration:HealthcareManagementAndConsulting", - "businessAdministration:Management", - "businessAdministration:ManagementInformationSystems", - "businessAdministration:Marketing", - "businessAdministration:MarketingAnalytics", - "businessAdministration:SocialInnovationAndEntrepreneurship", - "businessAdministration:SupplyChainManagement", - "cellAndMolecularBiology", - "chemicalEngineering", - "chemistry", - "civilEngineering", - "communicationStudies", - "computerEngineering", - "computerScience", - "computingAndLaw", - "criminologyAndCriminalJustice", - "culturalAnthropology", - "cybersecurity", - "dataScience", - "design", - "economics", - "electricalEngineering", - "english", - "environmentalAndSustainabilityStudies", - "environmentalEngineering", - "environmentalScience", - "environmentalStudies", - "gameArtAndAnimation", - "gameDesign", - "globalAsianStudies", - "healthScience", - "history", - "historyCultureAndLaw", - "humanServices", - "industrialEngineering", - "internationalAffairs", - "internationalBusiness", - "internationalBusiness:Accounting", - "internationalBusiness:AccountingAndAdvisoryServices", - "internationalBusiness:BrandManagement", - "internationalBusiness:BusinessAnalytics", - "internationalBusiness:CorporateInnovation", - "internationalBusiness:EntrepreneurialStartups", - "internationalBusiness:FamilyBusiness", - "internationalBusiness:Finance", - "internationalBusiness:Fintech", - "internationalBusiness:HealthcareManagementAndConsulting", - "internationalBusiness:Management", - "internationalBusiness:ManagementInformationSystems", - "internationalBusiness:Marketing", - "internationalBusiness:MarketingAnalytics", - "internationalBusiness:SocialInnovationAndEntrepreneurship", - "internationalBusiness:SupplyChainManagement", - "journalism", - "landscapeArchitecture", - "linguistics", - "marineBiology", - "mathematics", - "mechanicalEngineering", - "mediaAndScreenStudies", - "mediaArts", - "music", - "musicTechnology", - "nursing", - "pharmaceuticalSciences", - "pharmacy(PharmD)", - "philosophy", - "physics", - "politicalScience", - "politicsPhilosophyEconomics", - "psychology", - "publicHealth", - "publicRelations", - "religiousStudies", - "sociology", - "spanish", - "speechLanguagePathologyAndAudiology", - "theatre" - ], - "allOf": [ - { - "$ref": "#/definitions/models.Major" - } - ] - }, - "major2": { - "maxLength": 255, - "enum": [ - "africanaStudies", - "americanSignLanguage", - "americanSignLanguage-EnglishInterpreting", - "appliedPhysics", - "architecturalStudies", - "architecture", - "art:ArtVisualStudies", - "behavioralNeuroscience", - "biochemistry", - "bioengineering", - "biology", - "biomedicalPhysics", - "businessAdministration", - "businessAdministration:Accounting", - "businessAdministration:AccountingAndAdvisoryServices", - "businessAdministration:BrandManagement", - "businessAdministration:BusinessAnalytics", - "businessAdministration:CorporateInnovation", - "businessAdministration:EntrepreneurialStartups", - "businessAdministration:FamilyBusiness", - "businessAdministration:Finance", - "businessAdministration:Fintech", - "businessAdministration:HealthcareManagementAndConsulting", - "businessAdministration:Management", - "businessAdministration:ManagementInformationSystems", - "businessAdministration:Marketing", - "businessAdministration:MarketingAnalytics", - "businessAdministration:SocialInnovationAndEntrepreneurship", - "businessAdministration:SupplyChainManagement", - "cellAndMolecularBiology", - "chemicalEngineering", - "chemistry", - "civilEngineering", - "communicationStudies", - "computerEngineering", - "computerScience", - "computingAndLaw", - "criminologyAndCriminalJustice", - "culturalAnthropology", - "cybersecurity", - "dataScience", - "design", - "economics", - "electricalEngineering", - "english", - "environmentalAndSustainabilityStudies", - "environmentalEngineering", - "environmentalScience", - "environmentalStudies", - "gameArtAndAnimation", - "gameDesign", - "globalAsianStudies", - "healthScience", - "history", - "historyCultureAndLaw", - "humanServices", - "industrialEngineering", - "internationalAffairs", - "internationalBusiness", - "internationalBusiness:Accounting", - "internationalBusiness:AccountingAndAdvisoryServices", - "internationalBusiness:BrandManagement", - "internationalBusiness:BusinessAnalytics", - "internationalBusiness:CorporateInnovation", - "internationalBusiness:EntrepreneurialStartups", - "internationalBusiness:FamilyBusiness", - "internationalBusiness:Finance", - "internationalBusiness:Fintech", - "internationalBusiness:HealthcareManagementAndConsulting", - "internationalBusiness:Management", - "internationalBusiness:ManagementInformationSystems", - "internationalBusiness:Marketing", - "internationalBusiness:MarketingAnalytics", - "internationalBusiness:SocialInnovationAndEntrepreneurship", - "internationalBusiness:SupplyChainManagement", - "journalism", - "landscapeArchitecture", - "linguistics", - "marineBiology", - "mathematics", - "mechanicalEngineering", - "mediaAndScreenStudies", - "mediaArts", - "music", - "musicTechnology", - "nursing", - "pharmaceuticalSciences", - "pharmacy(PharmD)", - "philosophy", - "physics", - "politicalScience", - "politicsPhilosophyEconomics", - "psychology", - "publicHealth", - "publicRelations", - "religiousStudies", - "sociology", - "spanish", - "speechLanguagePathologyAndAudiology", - "theatre" - ], - "allOf": [ - { - "$ref": "#/definitions/models.Major" - } - ] - }, - "role": { - "type": "string", - "enum": [ - "super", - "student" - ] - }, - "updated_at": { - "type": "string", - "example": "2023-09-20T16:34:50Z" - } - } - }, - "models.VerifyEmailRequestBody": { - "type": "object", - "required": [ - "email", - "token" - ], - "properties": { - "email": { - "type": "string" - }, - "token": { - "type": "string" - } - } - }, - "models.VerifyPasswordResetTokenRequestBody": { - "type": "object", - "required": [ - "new_password", - "token", - "verify_new_password" - ], - "properties": { - "new_password": { - "type": "string", - "minLength": 8 - }, - "token": { - "type": "string" - }, - "verify_new_password": { - "type": "string", - "minLength": 8 - } - } - }, - "tag.CreateUserTagsBody": { - "type": "object", - "required": [ - "tags" - ], - "properties": { - "tags": { - "type": "array", - "items": { - "type": "string" - } - } - } - }, - "utilities.SuccessResponse": { - "type": "object", - "properties": { - "message": { - "type": "string" - } + "description": "User ID", + "name": "userID", + "in": "path", + "required": true + } + ], + "responses": { + "201": { + "description": "Created" + }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "401": { + "description": "Unauthorized", + "schema": {} + }, + "404": { + "description": "Not Found", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} + } + } + } + } + }, + "definitions": { + "models.Category": { + "type": "object", + "required": ["name"], + "properties": { + "created_at": { + "type": "string", + "example": "2023-09-20T16:34:50Z" + }, + "id": { + "type": "string", + "example": "123e4567-e89b-12d3-a456-426614174000" + }, + "name": { + "type": "string", + "maxLength": 255 + }, + "updated_at": { + "type": "string", + "example": "2023-09-20T16:34:50Z" + } + } + }, + "categories.CategoryRequestBody": { + "type": "object", + "required": ["name"], + "properties": { + "name": { + "type": "string", + "maxLength": 255 + } + } + }, + "models.Club": { + "type": "object", + "required": [ + "application_link", + "description", + "is_recruiting", + "name", + "num_members", + "preview", + "recruitment_cycle", + "recruitment_type" + ], + "properties": { + "application_link": { + "type": "string", + "maxLength": 255 + }, + "created_at": { + "type": "string", + "example": "2023-09-20T16:34:50Z" + }, + "description": { + "type": "string", + "maxLength": 255 + }, + "id": { + "type": "string", + "example": "123e4567-e89b-12d3-a456-426614174000" + }, + "is_recruiting": { + "type": "boolean" + }, + "logo": { + "type": "string", + "maxLength": 255 + }, + "name": { + "type": "string", + "maxLength": 255 + }, + "num_members": { + "type": "integer", + "minimum": 1 + }, + "one_word_to_describe_us": { + "type": "string", + "maxLength": 255 + }, + "preview": { + "type": "string", + "maxLength": 255 + }, + "recruitment_cycle": { + "maxLength": 255, + "enum": ["fall", "spring", "fallSpring", "always"], + "allOf": [ + { + "$ref": "#/definitions/models.RecruitmentCycle" + } + ] + }, + "recruitment_type": { + "maxLength": 255, + "enum": ["unrestricted", "tryout", "application"], + "allOf": [ + { + "$ref": "#/definitions/models.RecruitmentType" + } + ] + }, + "updated_at": { + "type": "string", + "example": "2023-09-20T16:34:50Z" + }, + "weekly_time_commitment": { + "type": "integer", + "minimum": 1 + } + } + }, + "models.College": { + "type": "string", + "enum": ["CAMD", "DMSB", "KCCS", "CE", "BCHS", "SL", "CPS", "CS", "CSSH"], + "x-enum-comments": { + "BCHS": "Bouvé College of Health Sciences", + "CAMD": "College of Arts, Media and Design", + "CE": "College of Engineering", + "CPS": "College of Professional Studies", + "CS": "College of Science", + "CSSH": "College of Social Sciences and Humanities", + "DMSB": "D'Amore-McKim School of Business", + "KCCS": "Khoury College of Computer Sciences", + "SL": "School of Law" + }, + "x-enum-varnames": [ + "CAMD", + "DMSB", + "KCCS", + "CE", + "BCHS", + "SL", + "CPS", + "CS", + "CSSH" + ] + }, + "models.Contact": { + "type": "object", + "required": ["content", "type"], + "properties": { + "content": { + "type": "string", + "maxLength": 255 + }, + "created_at": { + "type": "string", + "example": "2023-09-20T16:34:50Z" + }, + "id": { + "type": "string", + "example": "123e4567-e89b-12d3-a456-426614174000" + }, + "type": { + "maxLength": 255, + "enum": [ + "facebook", + "instagram", + "x", + "linkedin", + "youtube", + "github", + "slack", + "discord", + "email", + "customSite" + ], + "allOf": [ + { + "$ref": "#/definitions/models.ContactType" + } + ] + }, + "updated_at": { + "type": "string", + "example": "2023-09-20T16:34:50Z" + } + } + }, + "models.ContactType": { + "type": "string", + "enum": [ + "facebook", + "instagram", + "x", + "linkedin", + "youtube", + "github", + "slack", + "discord", + "email", + "customSite" + ], + "x-enum-varnames": [ + "Facebook", + "Instagram", + "X", + "LinkedIn", + "YouTube", + "GitHub", + "Slack", + "Discord", + "Email", + "CustomSite" + ] + }, + "CreateClubRequestBody": { + "type": "object", + "required": [ + "application_link", + "description", + "is_recruiting", + "name", + "preview", + "recruitment_cycle", + "recruitment_type", + "user_id" + ], + "properties": { + "application_link": { + "type": "string", + "maxLength": 255 + }, + "description": { + "type": "string", + "maxLength": 255 + }, + "is_recruiting": { + "type": "boolean" + }, + "logo": { + "type": "string", + "maxLength": 255 + }, + "name": { + "type": "string", + "maxLength": 255 + }, + "one_word_to_describe_us": { + "type": "string", + "maxLength": 255 + }, + "preview": { + "type": "string", + "maxLength": 255 + }, + "recruitment_cycle": { + "maxLength": 255, + "enum": ["fall", "spring", "fallSpring", "always"], + "allOf": [ + { + "$ref": "#/definitions/models.RecruitmentCycle" + } + ] + }, + "recruitment_type": { + "maxLength": 255, + "enum": ["unrestricted", "tryout", "application"], + "allOf": [ + { + "$ref": "#/definitions/models.RecruitmentType" + } + ] + }, + "user_id": { + "type": "string" + }, + "weekly_time_commitment": { + "type": "integer", + "minimum": 1 + } + } + }, + "CreateClubTagsRequestBody": { + "type": "object", + "required": ["tags"], + "properties": { + "tags": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "events.CreateEventRequestBody": { + "type": "object", + "required": [ + "content", + "end_time", + "event_type", + "host", + "is_recurring", + "location", + "name", + "preview", + "start_time" + ], + "properties": { + "content": { + "type": "string", + "maxLength": 255 + }, + "end_time": { + "type": "string" + }, + "event_type": { + "maxLength": 255, + "enum": ["open", "membersOnly"], + "allOf": [ + { + "$ref": "#/definitions/models.EventType" + } + ] + }, + "host": { + "description": "TODO club/tag/notification logic", + "type": "string" + }, + "is_recurring": { + "type": "boolean" + }, + "location": { + "type": "string", + "maxLength": 255 + }, + "name": { + "type": "string", + "maxLength": 255 + }, + "preview": { + "type": "string", + "maxLength": 255 + }, + "series": { + "description": "TODO validate if isRecurring, then series is required", + "allOf": [ + { + "$ref": "#/definitions/models.CreateSeriesRequestBody" + } + ] + }, + "start_time": { + "type": "string" + } + } + }, + "CreateFileRequestBody": { + "type": "object", + "required": ["owner_id", "owner_type"], + "properties": { + "owner_id": { + "type": "string" + }, + "owner_type": { + "type": "string", + "maxLength": 255 + } + } + }, + "models.CreateSeriesRequestBody": { + "type": "object", + "required": ["max_occurrences", "recurring_type"], + "properties": { + "max_occurrences": { + "type": "integer", + "minimum": 2 + }, + "recurring_type": { + "maxLength": 255, + "enum": ["daily", "weekly", "monthly"], + "allOf": [ + { + "$ref": "#/definitions/models.RecurringType" + } + ] + } + } + }, + "CreateTagRequestBody": { + "type": "object", + "required": ["category_id", "name"], + "properties": { + "category_id": { + "type": "string" + }, + "name": { + "type": "string", + "maxLength": 255 + } + } + }, + "CreateUserRequestBody": { + "type": "object", + "required": ["email", "first_name", "last_name", "password"], + "properties": { + "college": { + "enum": [ + "CAMD", + "DMSB", + "KCCS", + "CE", + "BCHS", + "SL", + "CPS", + "CS", + "CSSH" + ], + "allOf": [ + { + "$ref": "#/definitions/models.College" + } + ] + }, + "email": { + "type": "string", + "maxLength": 255 + }, + "first_name": { + "type": "string", + "maxLength": 255 + }, + "graduation_cycle": { + "maxLength": 255, + "enum": ["december", "may"], + "allOf": [ + { + "$ref": "#/definitions/models.GraduationCycle" + } + ] + }, + "graduation_year": { + "type": "integer" + }, + "last_name": { + "type": "string", + "maxLength": 255 + }, + "major0": { + "description": "Optional fields", + "maxLength": 255, + "enum": [ + "africanaStudies", + "americanSignLanguage", + "americanSignLanguage-EnglishInterpreting", + "appliedPhysics", + "architecturalStudies", + "architecture", + "art:ArtVisualStudies", + "behavioralNeuroscience", + "biochemistry", + "bioengineering", + "biology", + "biomedicalPhysics", + "businessAdministration", + "businessAdministration:Accounting", + "businessAdministration:AccountingAndAdvisoryServices", + "businessAdministration:BrandManagement", + "businessAdministration:BusinessAnalytics", + "businessAdministration:CorporateInnovation", + "businessAdministration:EntrepreneurialStartups", + "businessAdministration:FamilyBusiness", + "businessAdministration:Finance", + "businessAdministration:Fintech", + "businessAdministration:HealthcareManagementAndConsulting", + "businessAdministration:Management", + "businessAdministration:ManagementInformationSystems", + "businessAdministration:Marketing", + "businessAdministration:MarketingAnalytics", + "businessAdministration:SocialInnovationAndEntrepreneurship", + "businessAdministration:SupplyChainManagement", + "cellAndMolecularBiology", + "chemicalEngineering", + "chemistry", + "civilEngineering", + "communicationStudies", + "computerEngineering", + "computerScience", + "computingAndLaw", + "criminologyAndCriminalJustice", + "culturalAnthropology", + "cybersecurity", + "dataScience", + "design", + "economics", + "electricalEngineering", + "english", + "environmentalAndSustainabilityStudies", + "environmentalEngineering", + "environmentalScience", + "environmentalStudies", + "gameArtAndAnimation", + "gameDesign", + "globalAsianStudies", + "healthScience", + "history", + "historyCultureAndLaw", + "humanServices", + "industrialEngineering", + "internationalAffairs", + "internationalBusiness", + "internationalBusiness:Accounting", + "internationalBusiness:AccountingAndAdvisoryServices", + "internationalBusiness:BrandManagement", + "internationalBusiness:BusinessAnalytics", + "internationalBusiness:CorporateInnovation", + "internationalBusiness:EntrepreneurialStartups", + "internationalBusiness:FamilyBusiness", + "internationalBusiness:Finance", + "internationalBusiness:Fintech", + "internationalBusiness:HealthcareManagementAndConsulting", + "internationalBusiness:Management", + "internationalBusiness:ManagementInformationSystems", + "internationalBusiness:Marketing", + "internationalBusiness:MarketingAnalytics", + "internationalBusiness:SocialInnovationAndEntrepreneurship", + "internationalBusiness:SupplyChainManagement", + "journalism", + "landscapeArchitecture", + "linguistics", + "marineBiology", + "mathematics", + "mechanicalEngineering", + "mediaAndScreenStudies", + "mediaArts", + "music", + "musicTechnology", + "nursing", + "pharmaceuticalSciences", + "pharmacy(PharmD)", + "philosophy", + "physics", + "politicalScience", + "politicsPhilosophyEconomics", + "psychology", + "publicHealth", + "publicRelations", + "religiousStudies", + "sociology", + "spanish", + "speechLanguagePathologyAndAudiology", + "theatre" + ], + "allOf": [ + { + "$ref": "#/definitions/models.Major" + } + ] + }, + "major1": { + "maxLength": 255, + "enum": [ + "africanaStudies", + "americanSignLanguage", + "americanSignLanguage-EnglishInterpreting", + "appliedPhysics", + "architecturalStudies", + "architecture", + "art:ArtVisualStudies", + "behavioralNeuroscience", + "biochemistry", + "bioengineering", + "biology", + "biomedicalPhysics", + "businessAdministration", + "businessAdministration:Accounting", + "businessAdministration:AccountingAndAdvisoryServices", + "businessAdministration:BrandManagement", + "businessAdministration:BusinessAnalytics", + "businessAdministration:CorporateInnovation", + "businessAdministration:EntrepreneurialStartups", + "businessAdministration:FamilyBusiness", + "businessAdministration:Finance", + "businessAdministration:Fintech", + "businessAdministration:HealthcareManagementAndConsulting", + "businessAdministration:Management", + "businessAdministration:ManagementInformationSystems", + "businessAdministration:Marketing", + "businessAdministration:MarketingAnalytics", + "businessAdministration:SocialInnovationAndEntrepreneurship", + "businessAdministration:SupplyChainManagement", + "cellAndMolecularBiology", + "chemicalEngineering", + "chemistry", + "civilEngineering", + "communicationStudies", + "computerEngineering", + "computerScience", + "computingAndLaw", + "criminologyAndCriminalJustice", + "culturalAnthropology", + "cybersecurity", + "dataScience", + "design", + "economics", + "electricalEngineering", + "english", + "environmentalAndSustainabilityStudies", + "environmentalEngineering", + "environmentalScience", + "environmentalStudies", + "gameArtAndAnimation", + "gameDesign", + "globalAsianStudies", + "healthScience", + "history", + "historyCultureAndLaw", + "humanServices", + "industrialEngineering", + "internationalAffairs", + "internationalBusiness", + "internationalBusiness:Accounting", + "internationalBusiness:AccountingAndAdvisoryServices", + "internationalBusiness:BrandManagement", + "internationalBusiness:BusinessAnalytics", + "internationalBusiness:CorporateInnovation", + "internationalBusiness:EntrepreneurialStartups", + "internationalBusiness:FamilyBusiness", + "internationalBusiness:Finance", + "internationalBusiness:Fintech", + "internationalBusiness:HealthcareManagementAndConsulting", + "internationalBusiness:Management", + "internationalBusiness:ManagementInformationSystems", + "internationalBusiness:Marketing", + "internationalBusiness:MarketingAnalytics", + "internationalBusiness:SocialInnovationAndEntrepreneurship", + "internationalBusiness:SupplyChainManagement", + "journalism", + "landscapeArchitecture", + "linguistics", + "marineBiology", + "mathematics", + "mechanicalEngineering", + "mediaAndScreenStudies", + "mediaArts", + "music", + "musicTechnology", + "nursing", + "pharmaceuticalSciences", + "pharmacy(PharmD)", + "philosophy", + "physics", + "politicalScience", + "politicsPhilosophyEconomics", + "psychology", + "publicHealth", + "publicRelations", + "religiousStudies", + "sociology", + "spanish", + "speechLanguagePathologyAndAudiology", + "theatre" + ], + "allOf": [ + { + "$ref": "#/definitions/models.Major" + } + ] + }, + "major2": { + "maxLength": 255, + "enum": [ + "africanaStudies", + "americanSignLanguage", + "americanSignLanguage-EnglishInterpreting", + "appliedPhysics", + "architecturalStudies", + "architecture", + "art:ArtVisualStudies", + "behavioralNeuroscience", + "biochemistry", + "bioengineering", + "biology", + "biomedicalPhysics", + "businessAdministration", + "businessAdministration:Accounting", + "businessAdministration:AccountingAndAdvisoryServices", + "businessAdministration:BrandManagement", + "businessAdministration:BusinessAnalytics", + "businessAdministration:CorporateInnovation", + "businessAdministration:EntrepreneurialStartups", + "businessAdministration:FamilyBusiness", + "businessAdministration:Finance", + "businessAdministration:Fintech", + "businessAdministration:HealthcareManagementAndConsulting", + "businessAdministration:Management", + "businessAdministration:ManagementInformationSystems", + "businessAdministration:Marketing", + "businessAdministration:MarketingAnalytics", + "businessAdministration:SocialInnovationAndEntrepreneurship", + "businessAdministration:SupplyChainManagement", + "cellAndMolecularBiology", + "chemicalEngineering", + "chemistry", + "civilEngineering", + "communicationStudies", + "computerEngineering", + "computerScience", + "computingAndLaw", + "criminologyAndCriminalJustice", + "culturalAnthropology", + "cybersecurity", + "dataScience", + "design", + "economics", + "electricalEngineering", + "english", + "environmentalAndSustainabilityStudies", + "environmentalEngineering", + "environmentalScience", + "environmentalStudies", + "gameArtAndAnimation", + "gameDesign", + "globalAsianStudies", + "healthScience", + "history", + "historyCultureAndLaw", + "humanServices", + "industrialEngineering", + "internationalAffairs", + "internationalBusiness", + "internationalBusiness:Accounting", + "internationalBusiness:AccountingAndAdvisoryServices", + "internationalBusiness:BrandManagement", + "internationalBusiness:BusinessAnalytics", + "internationalBusiness:CorporateInnovation", + "internationalBusiness:EntrepreneurialStartups", + "internationalBusiness:FamilyBusiness", + "internationalBusiness:Finance", + "internationalBusiness:Fintech", + "internationalBusiness:HealthcareManagementAndConsulting", + "internationalBusiness:Management", + "internationalBusiness:ManagementInformationSystems", + "internationalBusiness:Marketing", + "internationalBusiness:MarketingAnalytics", + "internationalBusiness:SocialInnovationAndEntrepreneurship", + "internationalBusiness:SupplyChainManagement", + "journalism", + "landscapeArchitecture", + "linguistics", + "marineBiology", + "mathematics", + "mechanicalEngineering", + "mediaAndScreenStudies", + "mediaArts", + "music", + "musicTechnology", + "nursing", + "pharmaceuticalSciences", + "pharmacy(PharmD)", + "philosophy", + "physics", + "politicalScience", + "politicsPhilosophyEconomics", + "psychology", + "publicHealth", + "publicRelations", + "religiousStudies", + "sociology", + "spanish", + "speechLanguagePathologyAndAudiology", + "theatre" + ], + "allOf": [ + { + "$ref": "#/definitions/models.Major" + } + ] + }, + "password": { + "description": "MARK: must be validated manually", + "type": "string", + "maxLength": 255 + } + } + }, + "models.Event": { + "type": "object", + "required": [ + "content", + "end_time", + "event_type", + "location", + "name", + "preview", + "start_time" + ], + "properties": { + "content": { + "type": "string", + "maxLength": 255 + }, + "created_at": { + "type": "string", + "example": "2023-09-20T16:34:50Z" + }, + "end_time": { + "type": "string" + }, + "event_type": { + "maxLength": 255, + "enum": ["open", "membersOnly"], + "allOf": [ + { + "$ref": "#/definitions/models.EventType" + } + ] + }, + "host": { + "type": "string" + }, + "id": { + "type": "string", + "example": "123e4567-e89b-12d3-a456-426614174000" + }, + "is_recurring": { + "type": "boolean" + }, + "location": { + "type": "string", + "maxLength": 255 + }, + "meeting_link": { + "type": "string" + }, + "name": { + "type": "string", + "maxLength": 255 + }, + "preview": { + "type": "string", + "maxLength": 255 + }, + "start_time": { + "type": "string" + }, + "updated_at": { + "type": "string", + "example": "2023-09-20T16:34:50Z" + } + } + }, + "models.EventType": { + "type": "string", + "enum": ["open", "membersOnly"], + "x-enum-varnames": ["Open", "MembersOnly"] + }, + "models.File": { + "type": "object", + "required": [ + "file_name", + "file_size", + "file_type", + "file_url", + "object_key" + ], + "properties": { + "created_at": { + "type": "string", + "example": "2023-09-20T16:34:50Z" + }, + "file_name": { + "type": "string", + "maxLength": 255 + }, + "file_size": { + "type": "integer", + "minimum": 1 + }, + "file_type": { + "type": "string", + "maxLength": 255 + }, + "file_url": { + "type": "string", + "maxLength": 255 + }, + "id": { + "type": "string", + "example": "123e4567-e89b-12d3-a456-426614174000" + }, + "object_key": { + "type": "string", + "maxLength": 255 + }, + "updated_at": { + "type": "string", + "example": "2023-09-20T16:34:50Z" + } + } + }, + "models.GraduationCycle": { + "type": "string", + "enum": ["december", "may"], + "x-enum-varnames": ["December", "May"] + }, + "models.LoginResponseBody": { + "type": "object", + "required": ["email", "password"], + "properties": { + "email": { + "type": "string" + }, + "password": { + "description": "MARK: must be validated manually", + "type": "string", + "maxLength": 255 + } + } + }, + "models.Major": { + "type": "string", + "enum": [ + "africanaStudies", + "americanSignLanguage", + "americanSignLanguage-EnglishInterpreting", + "appliedPhysics", + "architecturalStudies", + "architecture", + "art:ArtVisualStudies", + "behavioralNeuroscience", + "biochemistry", + "bioengineering", + "biology", + "biomedicalPhysics", + "businessAdministration", + "businessAdministration:Accounting", + "businessAdministration:AccountingAndAdvisoryServices", + "businessAdministration:BrandManagement", + "businessAdministration:BusinessAnalytics", + "businessAdministration:CorporateInnovation", + "businessAdministration:EntrepreneurialStartups", + "businessAdministration:FamilyBusiness", + "businessAdministration:Finance", + "businessAdministration:Fintech", + "businessAdministration:HealthcareManagementAndConsulting", + "businessAdministration:Management", + "businessAdministration:ManagementInformationSystems", + "businessAdministration:Marketing", + "businessAdministration:MarketingAnalytics", + "businessAdministration:SocialInnovationAndEntrepreneurship", + "businessAdministration:SupplyChainManagement", + "cellAndMolecularBiology", + "chemicalEngineering", + "chemistry", + "civilEngineering", + "communicationStudies", + "computerEngineering", + "computerScience", + "computingAndLaw", + "criminologyAndCriminalJustice", + "culturalAnthropology", + "cybersecurity", + "dataScience", + "design", + "economics", + "electricalEngineering", + "english", + "environmentalAndSustainabilityStudies", + "environmentalEngineering", + "environmentalScience", + "environmentalStudies", + "gameArtAndAnimation", + "gameDesign", + "globalAsianStudies", + "healthScience", + "history", + "historyCultureAndLaw", + "humanServices", + "industrialEngineering", + "internationalAffairs", + "internationalBusiness", + "internationalBusiness:Accounting", + "internationalBusiness:AccountingAndAdvisoryServices", + "internationalBusiness:BrandManagement", + "internationalBusiness:BusinessAnalytics", + "internationalBusiness:CorporateInnovation", + "internationalBusiness:EntrepreneurialStartups", + "internationalBusiness:FamilyBusiness", + "internationalBusiness:Finance", + "internationalBusiness:Fintech", + "internationalBusiness:HealthcareManagementAndConsulting", + "internationalBusiness:Management", + "internationalBusiness:ManagementInformationSystems", + "internationalBusiness:Marketing", + "internationalBusiness:MarketingAnalytics", + "internationalBusiness:SocialInnovationAndEntrepreneurship", + "internationalBusiness:SupplyChainManagement", + "journalism", + "landscapeArchitecture", + "linguistics", + "marineBiology", + "mathematics", + "mechanicalEngineering", + "mediaAndScreenStudies", + "mediaArts", + "music", + "musicTechnology", + "nursing", + "pharmaceuticalSciences", + "pharmacy(PharmD)", + "philosophy", + "physics", + "politicalScience", + "politicsPhilosophyEconomics", + "psychology", + "publicHealth", + "publicRelations", + "religiousStudies", + "sociology", + "spanish", + "speechLanguagePathologyAndAudiology", + "theatre" + ], + "x-enum-varnames": [ + "AfricanaStudies", + "AmericanSignLanguage", + "AmericanSignLanguageEnglishInterpreting", + "AppliedPhysics", + "ArchitecturalStudies", + "Architecture", + "ArtArtVisualStudies", + "BehavioralNeuroscience", + "Biochemistry", + "Bioengineering", + "Biology", + "BiomedicalPhysics", + "BusinessAdministration", + "BusinessAdministrationAccounting", + "BusinessAdministrationAccountingAndAdvisoryServices", + "BusinessAdministrationBrandManagement", + "BusinessAdministrationBusinessAnalytics", + "BusinessAdministrationCorporateInnovation", + "BusinessAdministrationEntrepreneurialStartups", + "BusinessAdministrationFamilyBusiness", + "BusinessAdministrationFinance", + "BusinessAdministrationFintech", + "BusinessAdministrationHealthcareManagementAndConsulting", + "BusinessAdministrationManagement", + "BusinessAdministrationManagementInformationSystems", + "BusinessAdministrationMarketing", + "BusinessAdministrationMarketingAnalytics", + "BusinessAdministrationSocialInnovationAndEntrepreneurship", + "BusinessAdministrationSupplyChainManagement", + "CellAndMolecularBiology", + "ChemicalEngineering", + "Chemistry", + "CivilEngineering", + "CommunicationStudies", + "ComputerEngineering", + "ComputerScience", + "ComputingAndLaw", + "CriminologyAndCriminalJustice", + "CulturalAnthropology", + "Cybersecurity", + "DataScience", + "Design", + "Economics", + "ElectricalEngineering", + "English", + "EnvironmentalAndSustainabilityStudies", + "EnvironmentalEngineering", + "EnvironmentalScience", + "EnvironmentalStudies", + "GameArtAndAnimation", + "GameDesign", + "GlobalAsianStudies", + "HealthScience", + "History", + "HistoryCultureAndLaw", + "HumanServices", + "IndustrialEngineering", + "InternationalAffairs", + "InternationalBusiness", + "InternationalBusinessAccounting", + "InternationalBusinessAccountingAndAdvisoryServices", + "InternationalBusinessBrandManagement", + "InternationalBusinessBusinessAnalytics", + "InternationalBusinessCorporateInnovation", + "InternationalBusinessEntrepreneurialStartups", + "InternationalBusinessFamilyBusiness", + "InternationalBusinessFinance", + "InternationalBusinessFintech", + "InternationalBusinessHealthcareManagementAndConsulting", + "InternationalBusinessManagement", + "InternationalBusinessManagementInformationSystems", + "InternationalBusinessMarketing", + "InternationalBusinessMarketingAnalytics", + "InternationalBusinessSocialInnovationAndEntrepreneurship", + "InternationalBusinessSupplyChainManagement", + "Journalism", + "LandscapeArchitecture", + "Linguistics", + "MarineBiology", + "Mathematics", + "MechanicalEngineering", + "MediaAndScreenStudies", + "MediaArts", + "Music", + "MusicTechnology", + "Nursing", + "PharmaceuticalSciences", + "PharmacyPharmD", + "Philosophy", + "Physics", + "PoliticalScience", + "PoliticsPhilosophyEconomics", + "Psychology", + "PublicHealth", + "PublicRelations", + "ReligiousStudies", + "Sociology", + "Spanish", + "SpeechLanguagePathologyAndAudiology", + "Theatre" + ] + }, + "models.PointOfContact": { + "type": "object", + "required": ["email", "name", "position"], + "properties": { + "created_at": { + "type": "string", + "example": "2023-09-20T16:34:50Z" + }, + "email": { + "type": "string", + "maxLength": 255 + }, + "id": { + "type": "string", + "example": "123e4567-e89b-12d3-a456-426614174000" + }, + "name": { + "type": "string", + "maxLength": 255 + }, + "photo_file": { + "$ref": "#/definitions/models.File" + }, + "position": { + "type": "string", + "maxLength": 255 + }, + "updated_at": { + "type": "string", + "example": "2023-09-20T16:34:50Z" + } + } + }, + "PutContactRequestBody": { + "type": "object", + "required": ["content", "type"], + "properties": { + "content": { + "type": "string", + "maxLength": 255 + }, + "type": { + "maxLength": 255, + "enum": [ + "facebook", + "instagram", + "x", + "linkedin", + "youtube", + "github", + "slack", + "discord", + "email", + "customSite" + ], + "allOf": [ + { + "$ref": "#/definitions/models.ContactType" + } + ] + } + } + }, + "models.RecruitmentCycle": { + "type": "string", + "enum": ["fall", "spring", "fallSpring", "always"], + "x-enum-varnames": ["Fall", "Spring", "FallSpring", "Always"] + }, + "models.RecruitmentType": { + "type": "string", + "enum": ["unrestricted", "tryout", "application"], + "x-enum-varnames": ["Unrestricted", "Tryout", "Application"] + }, + "models.RecurringType": { + "type": "string", + "enum": ["daily", "weekly", "monthly"], + "x-enum-varnames": ["Daily", "Weekly", "Monthly"] + }, + "models.Series": { + "type": "object", + "properties": { + "created_at": { + "type": "string", + "example": "2023-09-20T16:34:50Z" + }, + "events": { + "type": "array", + "items": { + "$ref": "#/definitions/models.Event" + } + }, + "id": { + "type": "string", + "example": "123e4567-e89b-12d3-a456-426614174000" + }, + "max_occurrences": { + "type": "integer", + "minimum": 1 + }, + "recurring_type": { + "maxLength": 255, + "allOf": [ + { + "$ref": "#/definitions/models.RecurringType" + } + ] + }, + "updated_at": { + "type": "string", + "example": "2023-09-20T16:34:50Z" + } + } + }, + "models.Tag": { + "type": "object", + "required": ["category_id", "name"], + "properties": { + "category_id": { + "type": "string" + }, + "created_at": { + "type": "string", + "example": "2023-09-20T16:34:50Z" + }, + "id": { + "type": "string", + "example": "123e4567-e89b-12d3-a456-426614174000" + }, + "name": { + "type": "string", + "maxLength": 255 + }, + "updated_at": { + "type": "string", + "example": "2023-09-20T16:34:50Z" + } + } + }, + "UpdateClubRequestBody": { + "type": "object", + "required": ["application_link", "recruitment_cycle", "recruitment_type"], + "properties": { + "application_link": { + "type": "string", + "maxLength": 255 + }, + "description": { + "type": "string", + "maxLength": 255 + }, + "is_recruiting": { + "type": "boolean" + }, + "logo": { + "type": "string", + "maxLength": 255 + }, + "name": { + "type": "string", + "maxLength": 255 + }, + "one_word_to_describe_us": { + "type": "string", + "maxLength": 255 + }, + "preview": { + "type": "string", + "maxLength": 255 + }, + "recruitment_cycle": { + "maxLength": 255, + "enum": ["fall", "spring", "fallSpring", "always"], + "allOf": [ + { + "$ref": "#/definitions/models.RecruitmentCycle" + } + ] + }, + "recruitment_type": { + "maxLength": 255, + "enum": ["unrestricted", "tryout", "application"], + "allOf": [ + { + "$ref": "#/definitions/models.RecruitmentType" + } + ] + }, + "weekly_time_commitment": { + "type": "integer", + "minimum": 1 + } + } + }, + "events.UpdateEventRequestBody": { + "type": "object", + "properties": { + "content": { + "type": "string", + "maxLength": 255 + }, + "end_time": { + "type": "string" + }, + "event_type": { + "maxLength": 255, + "enum": ["open", "membersOnly"], + "allOf": [ + { + "$ref": "#/definitions/models.EventType" + } + ] + }, + "host": { + "type": "string" + }, + "location": { + "type": "string", + "maxLength": 255 + }, + "name": { + "type": "string", + "maxLength": 255 + }, + "preview": { + "type": "string", + "maxLength": 255 + }, + "start_time": { + "type": "string" + } + } + }, + "models.UpdatePasswordRequestBody": { + "type": "object", + "required": ["new_password", "old_password"], + "properties": { + "new_password": { + "description": "MARK: must be validated manually", + "type": "string", + "maxLength": 255 + }, + "old_password": { + "description": "MARK: must be validated manually", + "type": "string", + "maxLength": 255 + } + } + }, + "models.UpdateSeriesRequestBody": { + "type": "object", + "properties": { + "event_details": { + "$ref": "#/definitions/events.UpdateEventRequestBody" + }, + "max_occurrences": { + "type": "integer", + "minimum": 2 + }, + "recurring_type": { + "maxLength": 255, + "enum": ["daily", "weekly", "monthly"], + "allOf": [ + { + "$ref": "#/definitions/models.RecurringType" + } + ] + } + } + }, + "UpdateTagRequestBody": { + "type": "object", + "properties": { + "category_id": { + "type": "string" + }, + "name": { + "type": "string", + "maxLength": 255 + } + } + }, + "UpdateUserRequestBody": { + "type": "object", + "properties": { + "college": { + "enum": [ + "CAMD", + "DMSB", + "KCCS", + "CE", + "BCHS", + "SL", + "CPS", + "CS", + "CSSH" + ], + "allOf": [ + { + "$ref": "#/definitions/models.College" + } + ] + }, + "first_name": { + "type": "string", + "maxLength": 255 + }, + "graduation_cycle": { + "maxLength": 255, + "enum": ["december", "may"], + "allOf": [ + { + "$ref": "#/definitions/models.GraduationCycle" + } + ] + }, + "graduation_year": { + "type": "integer" + }, + "last_name": { + "type": "string", + "maxLength": 255 + }, + "major0": { + "maxLength": 255, + "enum": [ + "africanaStudies", + "americanSignLanguage", + "americanSignLanguage-EnglishInterpreting", + "appliedPhysics", + "architecturalStudies", + "architecture", + "art:ArtVisualStudies", + "behavioralNeuroscience", + "biochemistry", + "bioengineering", + "biology", + "biomedicalPhysics", + "businessAdministration", + "businessAdministration:Accounting", + "businessAdministration:AccountingAndAdvisoryServices", + "businessAdministration:BrandManagement", + "businessAdministration:BusinessAnalytics", + "businessAdministration:CorporateInnovation", + "businessAdministration:EntrepreneurialStartups", + "businessAdministration:FamilyBusiness", + "businessAdministration:Finance", + "businessAdministration:Fintech", + "businessAdministration:HealthcareManagementAndConsulting", + "businessAdministration:Management", + "businessAdministration:ManagementInformationSystems", + "businessAdministration:Marketing", + "businessAdministration:MarketingAnalytics", + "businessAdministration:SocialInnovationAndEntrepreneurship", + "businessAdministration:SupplyChainManagement", + "cellAndMolecularBiology", + "chemicalEngineering", + "chemistry", + "civilEngineering", + "communicationStudies", + "computerEngineering", + "computerScience", + "computingAndLaw", + "criminologyAndCriminalJustice", + "culturalAnthropology", + "cybersecurity", + "dataScience", + "design", + "economics", + "electricalEngineering", + "english", + "environmentalAndSustainabilityStudies", + "environmentalEngineering", + "environmentalScience", + "environmentalStudies", + "gameArtAndAnimation", + "gameDesign", + "globalAsianStudies", + "healthScience", + "history", + "historyCultureAndLaw", + "humanServices", + "industrialEngineering", + "internationalAffairs", + "internationalBusiness", + "internationalBusiness:Accounting", + "internationalBusiness:AccountingAndAdvisoryServices", + "internationalBusiness:BrandManagement", + "internationalBusiness:BusinessAnalytics", + "internationalBusiness:CorporateInnovation", + "internationalBusiness:EntrepreneurialStartups", + "internationalBusiness:FamilyBusiness", + "internationalBusiness:Finance", + "internationalBusiness:Fintech", + "internationalBusiness:HealthcareManagementAndConsulting", + "internationalBusiness:Management", + "internationalBusiness:ManagementInformationSystems", + "internationalBusiness:Marketing", + "internationalBusiness:MarketingAnalytics", + "internationalBusiness:SocialInnovationAndEntrepreneurship", + "internationalBusiness:SupplyChainManagement", + "journalism", + "landscapeArchitecture", + "linguistics", + "marineBiology", + "mathematics", + "mechanicalEngineering", + "mediaAndScreenStudies", + "mediaArts", + "music", + "musicTechnology", + "nursing", + "pharmaceuticalSciences", + "pharmacy(PharmD)", + "philosophy", + "physics", + "politicalScience", + "politicsPhilosophyEconomics", + "psychology", + "publicHealth", + "publicRelations", + "religiousStudies", + "sociology", + "spanish", + "speechLanguagePathologyAndAudiology", + "theatre" + ], + "allOf": [ + { + "$ref": "#/definitions/models.Major" + } + ] + }, + "major1": { + "maxLength": 255, + "enum": [ + "africanaStudies", + "americanSignLanguage", + "americanSignLanguage-EnglishInterpreting", + "appliedPhysics", + "architecturalStudies", + "architecture", + "art:ArtVisualStudies", + "behavioralNeuroscience", + "biochemistry", + "bioengineering", + "biology", + "biomedicalPhysics", + "businessAdministration", + "businessAdministration:Accounting", + "businessAdministration:AccountingAndAdvisoryServices", + "businessAdministration:BrandManagement", + "businessAdministration:BusinessAnalytics", + "businessAdministration:CorporateInnovation", + "businessAdministration:EntrepreneurialStartups", + "businessAdministration:FamilyBusiness", + "businessAdministration:Finance", + "businessAdministration:Fintech", + "businessAdministration:HealthcareManagementAndConsulting", + "businessAdministration:Management", + "businessAdministration:ManagementInformationSystems", + "businessAdministration:Marketing", + "businessAdministration:MarketingAnalytics", + "businessAdministration:SocialInnovationAndEntrepreneurship", + "businessAdministration:SupplyChainManagement", + "cellAndMolecularBiology", + "chemicalEngineering", + "chemistry", + "civilEngineering", + "communicationStudies", + "computerEngineering", + "computerScience", + "computingAndLaw", + "criminologyAndCriminalJustice", + "culturalAnthropology", + "cybersecurity", + "dataScience", + "design", + "economics", + "electricalEngineering", + "english", + "environmentalAndSustainabilityStudies", + "environmentalEngineering", + "environmentalScience", + "environmentalStudies", + "gameArtAndAnimation", + "gameDesign", + "globalAsianStudies", + "healthScience", + "history", + "historyCultureAndLaw", + "humanServices", + "industrialEngineering", + "internationalAffairs", + "internationalBusiness", + "internationalBusiness:Accounting", + "internationalBusiness:AccountingAndAdvisoryServices", + "internationalBusiness:BrandManagement", + "internationalBusiness:BusinessAnalytics", + "internationalBusiness:CorporateInnovation", + "internationalBusiness:EntrepreneurialStartups", + "internationalBusiness:FamilyBusiness", + "internationalBusiness:Finance", + "internationalBusiness:Fintech", + "internationalBusiness:HealthcareManagementAndConsulting", + "internationalBusiness:Management", + "internationalBusiness:ManagementInformationSystems", + "internationalBusiness:Marketing", + "internationalBusiness:MarketingAnalytics", + "internationalBusiness:SocialInnovationAndEntrepreneurship", + "internationalBusiness:SupplyChainManagement", + "journalism", + "landscapeArchitecture", + "linguistics", + "marineBiology", + "mathematics", + "mechanicalEngineering", + "mediaAndScreenStudies", + "mediaArts", + "music", + "musicTechnology", + "nursing", + "pharmaceuticalSciences", + "pharmacy(PharmD)", + "philosophy", + "physics", + "politicalScience", + "politicsPhilosophyEconomics", + "psychology", + "publicHealth", + "publicRelations", + "religiousStudies", + "sociology", + "spanish", + "speechLanguagePathologyAndAudiology", + "theatre" + ], + "allOf": [ + { + "$ref": "#/definitions/models.Major" + } + ] + }, + "major2": { + "maxLength": 255, + "enum": [ + "africanaStudies", + "americanSignLanguage", + "americanSignLanguage-EnglishInterpreting", + "appliedPhysics", + "architecturalStudies", + "architecture", + "art:ArtVisualStudies", + "behavioralNeuroscience", + "biochemistry", + "bioengineering", + "biology", + "biomedicalPhysics", + "businessAdministration", + "businessAdministration:Accounting", + "businessAdministration:AccountingAndAdvisoryServices", + "businessAdministration:BrandManagement", + "businessAdministration:BusinessAnalytics", + "businessAdministration:CorporateInnovation", + "businessAdministration:EntrepreneurialStartups", + "businessAdministration:FamilyBusiness", + "businessAdministration:Finance", + "businessAdministration:Fintech", + "businessAdministration:HealthcareManagementAndConsulting", + "businessAdministration:Management", + "businessAdministration:ManagementInformationSystems", + "businessAdministration:Marketing", + "businessAdministration:MarketingAnalytics", + "businessAdministration:SocialInnovationAndEntrepreneurship", + "businessAdministration:SupplyChainManagement", + "cellAndMolecularBiology", + "chemicalEngineering", + "chemistry", + "civilEngineering", + "communicationStudies", + "computerEngineering", + "computerScience", + "computingAndLaw", + "criminologyAndCriminalJustice", + "culturalAnthropology", + "cybersecurity", + "dataScience", + "design", + "economics", + "electricalEngineering", + "english", + "environmentalAndSustainabilityStudies", + "environmentalEngineering", + "environmentalScience", + "environmentalStudies", + "gameArtAndAnimation", + "gameDesign", + "globalAsianStudies", + "healthScience", + "history", + "historyCultureAndLaw", + "humanServices", + "industrialEngineering", + "internationalAffairs", + "internationalBusiness", + "internationalBusiness:Accounting", + "internationalBusiness:AccountingAndAdvisoryServices", + "internationalBusiness:BrandManagement", + "internationalBusiness:BusinessAnalytics", + "internationalBusiness:CorporateInnovation", + "internationalBusiness:EntrepreneurialStartups", + "internationalBusiness:FamilyBusiness", + "internationalBusiness:Finance", + "internationalBusiness:Fintech", + "internationalBusiness:HealthcareManagementAndConsulting", + "internationalBusiness:Management", + "internationalBusiness:ManagementInformationSystems", + "internationalBusiness:Marketing", + "internationalBusiness:MarketingAnalytics", + "internationalBusiness:SocialInnovationAndEntrepreneurship", + "internationalBusiness:SupplyChainManagement", + "journalism", + "landscapeArchitecture", + "linguistics", + "marineBiology", + "mathematics", + "mechanicalEngineering", + "mediaAndScreenStudies", + "mediaArts", + "music", + "musicTechnology", + "nursing", + "pharmaceuticalSciences", + "pharmacy(PharmD)", + "philosophy", + "physics", + "politicalScience", + "politicsPhilosophyEconomics", + "psychology", + "publicHealth", + "publicRelations", + "religiousStudies", + "sociology", + "spanish", + "speechLanguagePathologyAndAudiology", + "theatre" + ], + "allOf": [ + { + "$ref": "#/definitions/models.Major" + } + ] + } + } + }, + "models.User": { + "type": "object", + "required": [ + "college", + "email", + "first_name", + "graduation_cycle", + "graduation_year", + "last_name", + "major0", + "role" + ], + "properties": { + "college": { + "maxLength": 255, + "allOf": [ + { + "$ref": "#/definitions/models.College" + } + ] + }, + "created_at": { + "type": "string", + "example": "2023-09-20T16:34:50Z" + }, + "email": { + "type": "string", + "maxLength": 255 + }, + "first_name": { + "type": "string", + "maxLength": 255 + }, + "graduation_cycle": { + "maxLength": 255, + "enum": ["december", "may"], + "allOf": [ + { + "$ref": "#/definitions/models.GraduationCycle" + } + ] + }, + "graduation_year": { + "type": "integer" + }, + "id": { + "type": "string", + "example": "123e4567-e89b-12d3-a456-426614174000" + }, + "is_verified": { + "type": "boolean" + }, + "last_name": { + "type": "string", + "maxLength": 255 + }, + "major0": { + "maxLength": 255, + "enum": [ + "africanaStudies", + "americanSignLanguage", + "americanSignLanguage-EnglishInterpreting", + "appliedPhysics", + "architecturalStudies", + "architecture", + "art:ArtVisualStudies", + "behavioralNeuroscience", + "biochemistry", + "bioengineering", + "biology", + "biomedicalPhysics", + "businessAdministration", + "businessAdministration:Accounting", + "businessAdministration:AccountingAndAdvisoryServices", + "businessAdministration:BrandManagement", + "businessAdministration:BusinessAnalytics", + "businessAdministration:CorporateInnovation", + "businessAdministration:EntrepreneurialStartups", + "businessAdministration:FamilyBusiness", + "businessAdministration:Finance", + "businessAdministration:Fintech", + "businessAdministration:HealthcareManagementAndConsulting", + "businessAdministration:Management", + "businessAdministration:ManagementInformationSystems", + "businessAdministration:Marketing", + "businessAdministration:MarketingAnalytics", + "businessAdministration:SocialInnovationAndEntrepreneurship", + "businessAdministration:SupplyChainManagement", + "cellAndMolecularBiology", + "chemicalEngineering", + "chemistry", + "civilEngineering", + "communicationStudies", + "computerEngineering", + "computerScience", + "computingAndLaw", + "criminologyAndCriminalJustice", + "culturalAnthropology", + "cybersecurity", + "dataScience", + "design", + "economics", + "electricalEngineering", + "english", + "environmentalAndSustainabilityStudies", + "environmentalEngineering", + "environmentalScience", + "environmentalStudies", + "gameArtAndAnimation", + "gameDesign", + "globalAsianStudies", + "healthScience", + "history", + "historyCultureAndLaw", + "humanServices", + "industrialEngineering", + "internationalAffairs", + "internationalBusiness", + "internationalBusiness:Accounting", + "internationalBusiness:AccountingAndAdvisoryServices", + "internationalBusiness:BrandManagement", + "internationalBusiness:BusinessAnalytics", + "internationalBusiness:CorporateInnovation", + "internationalBusiness:EntrepreneurialStartups", + "internationalBusiness:FamilyBusiness", + "internationalBusiness:Finance", + "internationalBusiness:Fintech", + "internationalBusiness:HealthcareManagementAndConsulting", + "internationalBusiness:Management", + "internationalBusiness:ManagementInformationSystems", + "internationalBusiness:Marketing", + "internationalBusiness:MarketingAnalytics", + "internationalBusiness:SocialInnovationAndEntrepreneurship", + "internationalBusiness:SupplyChainManagement", + "journalism", + "landscapeArchitecture", + "linguistics", + "marineBiology", + "mathematics", + "mechanicalEngineering", + "mediaAndScreenStudies", + "mediaArts", + "music", + "musicTechnology", + "nursing", + "pharmaceuticalSciences", + "pharmacy(PharmD)", + "philosophy", + "physics", + "politicalScience", + "politicsPhilosophyEconomics", + "psychology", + "publicHealth", + "publicRelations", + "religiousStudies", + "sociology", + "spanish", + "speechLanguagePathologyAndAudiology", + "theatre" + ], + "allOf": [ + { + "$ref": "#/definitions/models.Major" + } + ] + }, + "major1": { + "maxLength": 255, + "enum": [ + "africanaStudies", + "americanSignLanguage", + "americanSignLanguage-EnglishInterpreting", + "appliedPhysics", + "architecturalStudies", + "architecture", + "art:ArtVisualStudies", + "behavioralNeuroscience", + "biochemistry", + "bioengineering", + "biology", + "biomedicalPhysics", + "businessAdministration", + "businessAdministration:Accounting", + "businessAdministration:AccountingAndAdvisoryServices", + "businessAdministration:BrandManagement", + "businessAdministration:BusinessAnalytics", + "businessAdministration:CorporateInnovation", + "businessAdministration:EntrepreneurialStartups", + "businessAdministration:FamilyBusiness", + "businessAdministration:Finance", + "businessAdministration:Fintech", + "businessAdministration:HealthcareManagementAndConsulting", + "businessAdministration:Management", + "businessAdministration:ManagementInformationSystems", + "businessAdministration:Marketing", + "businessAdministration:MarketingAnalytics", + "businessAdministration:SocialInnovationAndEntrepreneurship", + "businessAdministration:SupplyChainManagement", + "cellAndMolecularBiology", + "chemicalEngineering", + "chemistry", + "civilEngineering", + "communicationStudies", + "computerEngineering", + "computerScience", + "computingAndLaw", + "criminologyAndCriminalJustice", + "culturalAnthropology", + "cybersecurity", + "dataScience", + "design", + "economics", + "electricalEngineering", + "english", + "environmentalAndSustainabilityStudies", + "environmentalEngineering", + "environmentalScience", + "environmentalStudies", + "gameArtAndAnimation", + "gameDesign", + "globalAsianStudies", + "healthScience", + "history", + "historyCultureAndLaw", + "humanServices", + "industrialEngineering", + "internationalAffairs", + "internationalBusiness", + "internationalBusiness:Accounting", + "internationalBusiness:AccountingAndAdvisoryServices", + "internationalBusiness:BrandManagement", + "internationalBusiness:BusinessAnalytics", + "internationalBusiness:CorporateInnovation", + "internationalBusiness:EntrepreneurialStartups", + "internationalBusiness:FamilyBusiness", + "internationalBusiness:Finance", + "internationalBusiness:Fintech", + "internationalBusiness:HealthcareManagementAndConsulting", + "internationalBusiness:Management", + "internationalBusiness:ManagementInformationSystems", + "internationalBusiness:Marketing", + "internationalBusiness:MarketingAnalytics", + "internationalBusiness:SocialInnovationAndEntrepreneurship", + "internationalBusiness:SupplyChainManagement", + "journalism", + "landscapeArchitecture", + "linguistics", + "marineBiology", + "mathematics", + "mechanicalEngineering", + "mediaAndScreenStudies", + "mediaArts", + "music", + "musicTechnology", + "nursing", + "pharmaceuticalSciences", + "pharmacy(PharmD)", + "philosophy", + "physics", + "politicalScience", + "politicsPhilosophyEconomics", + "psychology", + "publicHealth", + "publicRelations", + "religiousStudies", + "sociology", + "spanish", + "speechLanguagePathologyAndAudiology", + "theatre" + ], + "allOf": [ + { + "$ref": "#/definitions/models.Major" + } + ] + }, + "major2": { + "maxLength": 255, + "enum": [ + "africanaStudies", + "americanSignLanguage", + "americanSignLanguage-EnglishInterpreting", + "appliedPhysics", + "architecturalStudies", + "architecture", + "art:ArtVisualStudies", + "behavioralNeuroscience", + "biochemistry", + "bioengineering", + "biology", + "biomedicalPhysics", + "businessAdministration", + "businessAdministration:Accounting", + "businessAdministration:AccountingAndAdvisoryServices", + "businessAdministration:BrandManagement", + "businessAdministration:BusinessAnalytics", + "businessAdministration:CorporateInnovation", + "businessAdministration:EntrepreneurialStartups", + "businessAdministration:FamilyBusiness", + "businessAdministration:Finance", + "businessAdministration:Fintech", + "businessAdministration:HealthcareManagementAndConsulting", + "businessAdministration:Management", + "businessAdministration:ManagementInformationSystems", + "businessAdministration:Marketing", + "businessAdministration:MarketingAnalytics", + "businessAdministration:SocialInnovationAndEntrepreneurship", + "businessAdministration:SupplyChainManagement", + "cellAndMolecularBiology", + "chemicalEngineering", + "chemistry", + "civilEngineering", + "communicationStudies", + "computerEngineering", + "computerScience", + "computingAndLaw", + "criminologyAndCriminalJustice", + "culturalAnthropology", + "cybersecurity", + "dataScience", + "design", + "economics", + "electricalEngineering", + "english", + "environmentalAndSustainabilityStudies", + "environmentalEngineering", + "environmentalScience", + "environmentalStudies", + "gameArtAndAnimation", + "gameDesign", + "globalAsianStudies", + "healthScience", + "history", + "historyCultureAndLaw", + "humanServices", + "industrialEngineering", + "internationalAffairs", + "internationalBusiness", + "internationalBusiness:Accounting", + "internationalBusiness:AccountingAndAdvisoryServices", + "internationalBusiness:BrandManagement", + "internationalBusiness:BusinessAnalytics", + "internationalBusiness:CorporateInnovation", + "internationalBusiness:EntrepreneurialStartups", + "internationalBusiness:FamilyBusiness", + "internationalBusiness:Finance", + "internationalBusiness:Fintech", + "internationalBusiness:HealthcareManagementAndConsulting", + "internationalBusiness:Management", + "internationalBusiness:ManagementInformationSystems", + "internationalBusiness:Marketing", + "internationalBusiness:MarketingAnalytics", + "internationalBusiness:SocialInnovationAndEntrepreneurship", + "internationalBusiness:SupplyChainManagement", + "journalism", + "landscapeArchitecture", + "linguistics", + "marineBiology", + "mathematics", + "mechanicalEngineering", + "mediaAndScreenStudies", + "mediaArts", + "music", + "musicTechnology", + "nursing", + "pharmaceuticalSciences", + "pharmacy(PharmD)", + "philosophy", + "physics", + "politicalScience", + "politicsPhilosophyEconomics", + "psychology", + "publicHealth", + "publicRelations", + "religiousStudies", + "sociology", + "spanish", + "speechLanguagePathologyAndAudiology", + "theatre" + ], + "allOf": [ + { + "$ref": "#/definitions/models.Major" } + ] + }, + "role": { + "type": "string", + "enum": ["super", "student"] + }, + "updated_at": { + "type": "string", + "example": "2023-09-20T16:34:50Z" + } + } + }, + "models.VerifyEmailRequestBody": { + "type": "object", + "required": ["email", "token"], + "properties": { + "email": { + "type": "string" + }, + "token": { + "type": "string" + } + } + }, + "models.VerifyPasswordResetTokenRequestBody": { + "type": "object", + "required": ["new_password", "token", "verify_new_password"], + "properties": { + "new_password": { + "type": "string", + "minLength": 8 + }, + "token": { + "type": "string" + }, + "verify_new_password": { + "type": "string", + "minLength": 8 + } + } + }, + "tag.CreateUserTagsBody": { + "type": "object", + "required": ["tags"], + "properties": { + "tags": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "utilities.SuccessResponse": { + "type": "object", + "properties": { + "message": { + "type": "string" } + } } -} \ No newline at end of file + } +} diff --git a/backend/docs/swagger.yaml b/backend/docs/swagger.yaml index b2bf42cf7..ff6e151e5 100644 --- a/backend/docs/swagger.yaml +++ b/backend/docs/swagger.yaml @@ -14,15 +14,15 @@ definitions: example: "2023-09-20T16:34:50Z" type: string required: - - name + - name type: object - models.CategoryRequestBody: + categories.CategoryRequestBody: properties: name: maxLength: 255 type: string required: - - name + - name type: object models.Club: properties: @@ -57,20 +57,20 @@ definitions: type: string recruitment_cycle: allOf: - - $ref: '#/definitions/models.RecruitmentCycle' + - $ref: "#/definitions/models.RecruitmentCycle" enum: - - fall - - spring - - fallSpring - - always + - fall + - spring + - fallSpring + - always maxLength: 255 recruitment_type: allOf: - - $ref: '#/definitions/models.RecruitmentType' + - $ref: "#/definitions/models.RecruitmentType" enum: - - unrestricted - - tryout - - application + - unrestricted + - tryout + - application maxLength: 255 updated_at: example: "2023-09-20T16:34:50Z" @@ -79,26 +79,26 @@ definitions: minimum: 1 type: integer required: - - application_link - - description - - is_recruiting - - name - - num_members - - preview - - recruitment_cycle - - recruitment_type + - application_link + - description + - is_recruiting + - name + - num_members + - preview + - recruitment_cycle + - recruitment_type type: object models.College: enum: - - CAMD - - DMSB - - KCCS - - CE - - BCHS - - SL - - CPS - - CS - - CSSH + - CAMD + - DMSB + - KCCS + - CE + - BCHS + - SL + - CPS + - CS + - CSSH type: string x-enum-comments: BCHS: Bouvé College of Health Sciences @@ -111,15 +111,15 @@ definitions: KCCS: Khoury College of Computer Sciences SL: School of Law x-enum-varnames: - - CAMD - - DMSB - - KCCS - - CE - - BCHS - - SL - - CPS - - CS - - CSSH + - CAMD + - DMSB + - KCCS + - CE + - BCHS + - SL + - CPS + - CS + - CSSH models.Contact: properties: content: @@ -133,51 +133,51 @@ definitions: type: string type: allOf: - - $ref: '#/definitions/models.ContactType' + - $ref: "#/definitions/models.ContactType" enum: - - facebook - - instagram - - x - - linkedin - - youtube - - github - - slack - - discord - - email - - customSite + - facebook + - instagram + - x + - linkedin + - youtube + - github + - slack + - discord + - email + - customSite maxLength: 255 updated_at: example: "2023-09-20T16:34:50Z" type: string required: - - content - - type + - content + - type type: object models.ContactType: enum: - - facebook - - instagram - - x - - linkedin - - youtube - - github - - slack - - discord - - email - - customSite + - facebook + - instagram + - x + - linkedin + - youtube + - github + - slack + - discord + - email + - customSite type: string x-enum-varnames: - - Facebook - - Instagram - - X - - LinkedIn - - YouTube - - GitHub - - Slack - - Discord - - Email - - CustomSite - models.CreateClubRequestBody: + - Facebook + - Instagram + - X + - LinkedIn + - YouTube + - GitHub + - Slack + - Discord + - Email + - CustomSite + CreateClubRequestBody: properties: application_link: maxLength: 255 @@ -201,20 +201,20 @@ definitions: type: string recruitment_cycle: allOf: - - $ref: '#/definitions/models.RecruitmentCycle' + - $ref: "#/definitions/models.RecruitmentCycle" enum: - - fall - - spring - - fallSpring - - always + - fall + - spring + - fallSpring + - always maxLength: 255 recruitment_type: allOf: - - $ref: '#/definitions/models.RecruitmentType' + - $ref: "#/definitions/models.RecruitmentType" enum: - - unrestricted - - tryout - - application + - unrestricted + - tryout + - application maxLength: 255 user_id: type: string @@ -222,25 +222,25 @@ definitions: minimum: 1 type: integer required: - - application_link - - description - - is_recruiting - - name - - preview - - recruitment_cycle - - recruitment_type - - user_id + - application_link + - description + - is_recruiting + - name + - preview + - recruitment_cycle + - recruitment_type + - user_id type: object - models.CreateClubTagsRequestBody: + CreateClubTagsRequestBody: properties: tags: items: type: string type: array required: - - tags + - tags type: object - models.CreateEventRequestBody: + events.CreateEventRequestBody: properties: content: maxLength: 255 @@ -249,10 +249,10 @@ definitions: type: string event_type: allOf: - - $ref: '#/definitions/models.EventType' + - $ref: "#/definitions/models.EventType" enum: - - open - - membersOnly + - open + - membersOnly maxLength: 255 host: description: TODO club/tag/notification logic @@ -270,22 +270,22 @@ definitions: type: string series: allOf: - - $ref: '#/definitions/models.CreateSeriesRequestBody' + - $ref: "#/definitions/models.CreateSeriesRequestBody" description: TODO validate if isRecurring, then series is required start_time: type: string required: - - content - - end_time - - event_type - - host - - is_recurring - - location - - name - - preview - - start_time + - content + - end_time + - event_type + - host + - is_recurring + - location + - name + - preview + - start_time type: object - models.CreateFileRequestBody: + CreateFileRequestBody: properties: owner_id: type: string @@ -293,8 +293,8 @@ definitions: maxLength: 255 type: string required: - - owner_id - - owner_type + - owner_id + - owner_type type: object models.CreateSeriesRequestBody: properties: @@ -303,17 +303,17 @@ definitions: type: integer recurring_type: allOf: - - $ref: '#/definitions/models.RecurringType' + - $ref: "#/definitions/models.RecurringType" enum: - - daily - - weekly - - monthly + - daily + - weekly + - monthly maxLength: 255 required: - - max_occurrences - - recurring_type + - max_occurrences + - recurring_type type: object - models.CreateTagRequestBody: + CreateTagRequestBody: properties: category_id: type: string @@ -321,24 +321,24 @@ definitions: maxLength: 255 type: string required: - - category_id - - name + - category_id + - name type: object - models.CreateUserRequestBody: + CreateUserRequestBody: properties: college: allOf: - - $ref: '#/definitions/models.College' + - $ref: "#/definitions/models.College" enum: - - CAMD - - DMSB - - KCCS - - CE - - BCHS - - SL - - CPS - - CS - - CSSH + - CAMD + - DMSB + - KCCS + - CE + - BCHS + - SL + - CPS + - CS + - CSSH email: maxLength: 255 type: string @@ -347,10 +347,10 @@ definitions: type: string graduation_cycle: allOf: - - $ref: '#/definitions/models.GraduationCycle' + - $ref: "#/definitions/models.GraduationCycle" enum: - - december - - may + - december + - may maxLength: 255 graduation_year: type: integer @@ -359,329 +359,329 @@ definitions: type: string major0: allOf: - - $ref: '#/definitions/models.Major' + - $ref: "#/definitions/models.Major" description: Optional fields enum: - - africanaStudies - - americanSignLanguage - - americanSignLanguage-EnglishInterpreting - - appliedPhysics - - architecturalStudies - - architecture - - art:ArtVisualStudies - - behavioralNeuroscience - - biochemistry - - bioengineering - - biology - - biomedicalPhysics - - businessAdministration - - businessAdministration:Accounting - - businessAdministration:AccountingAndAdvisoryServices - - businessAdministration:BrandManagement - - businessAdministration:BusinessAnalytics - - businessAdministration:CorporateInnovation - - businessAdministration:EntrepreneurialStartups - - businessAdministration:FamilyBusiness - - businessAdministration:Finance - - businessAdministration:Fintech - - businessAdministration:HealthcareManagementAndConsulting - - businessAdministration:Management - - businessAdministration:ManagementInformationSystems - - businessAdministration:Marketing - - businessAdministration:MarketingAnalytics - - businessAdministration:SocialInnovationAndEntrepreneurship - - businessAdministration:SupplyChainManagement - - cellAndMolecularBiology - - chemicalEngineering - - chemistry - - civilEngineering - - communicationStudies - - computerEngineering - - computerScience - - computingAndLaw - - criminologyAndCriminalJustice - - culturalAnthropology - - cybersecurity - - dataScience - - design - - economics - - electricalEngineering - - english - - environmentalAndSustainabilityStudies - - environmentalEngineering - - environmentalScience - - environmentalStudies - - gameArtAndAnimation - - gameDesign - - globalAsianStudies - - healthScience - - history - - historyCultureAndLaw - - humanServices - - industrialEngineering - - internationalAffairs - - internationalBusiness - - internationalBusiness:Accounting - - internationalBusiness:AccountingAndAdvisoryServices - - internationalBusiness:BrandManagement - - internationalBusiness:BusinessAnalytics - - internationalBusiness:CorporateInnovation - - internationalBusiness:EntrepreneurialStartups - - internationalBusiness:FamilyBusiness - - internationalBusiness:Finance - - internationalBusiness:Fintech - - internationalBusiness:HealthcareManagementAndConsulting - - internationalBusiness:Management - - internationalBusiness:ManagementInformationSystems - - internationalBusiness:Marketing - - internationalBusiness:MarketingAnalytics - - internationalBusiness:SocialInnovationAndEntrepreneurship - - internationalBusiness:SupplyChainManagement - - journalism - - landscapeArchitecture - - linguistics - - marineBiology - - mathematics - - mechanicalEngineering - - mediaAndScreenStudies - - mediaArts - - music - - musicTechnology - - nursing - - pharmaceuticalSciences - - pharmacy(PharmD) - - philosophy - - physics - - politicalScience - - politicsPhilosophyEconomics - - psychology - - publicHealth - - publicRelations - - religiousStudies - - sociology - - spanish - - speechLanguagePathologyAndAudiology - - theatre + - africanaStudies + - americanSignLanguage + - americanSignLanguage-EnglishInterpreting + - appliedPhysics + - architecturalStudies + - architecture + - art:ArtVisualStudies + - behavioralNeuroscience + - biochemistry + - bioengineering + - biology + - biomedicalPhysics + - businessAdministration + - businessAdministration:Accounting + - businessAdministration:AccountingAndAdvisoryServices + - businessAdministration:BrandManagement + - businessAdministration:BusinessAnalytics + - businessAdministration:CorporateInnovation + - businessAdministration:EntrepreneurialStartups + - businessAdministration:FamilyBusiness + - businessAdministration:Finance + - businessAdministration:Fintech + - businessAdministration:HealthcareManagementAndConsulting + - businessAdministration:Management + - businessAdministration:ManagementInformationSystems + - businessAdministration:Marketing + - businessAdministration:MarketingAnalytics + - businessAdministration:SocialInnovationAndEntrepreneurship + - businessAdministration:SupplyChainManagement + - cellAndMolecularBiology + - chemicalEngineering + - chemistry + - civilEngineering + - communicationStudies + - computerEngineering + - computerScience + - computingAndLaw + - criminologyAndCriminalJustice + - culturalAnthropology + - cybersecurity + - dataScience + - design + - economics + - electricalEngineering + - english + - environmentalAndSustainabilityStudies + - environmentalEngineering + - environmentalScience + - environmentalStudies + - gameArtAndAnimation + - gameDesign + - globalAsianStudies + - healthScience + - history + - historyCultureAndLaw + - humanServices + - industrialEngineering + - internationalAffairs + - internationalBusiness + - internationalBusiness:Accounting + - internationalBusiness:AccountingAndAdvisoryServices + - internationalBusiness:BrandManagement + - internationalBusiness:BusinessAnalytics + - internationalBusiness:CorporateInnovation + - internationalBusiness:EntrepreneurialStartups + - internationalBusiness:FamilyBusiness + - internationalBusiness:Finance + - internationalBusiness:Fintech + - internationalBusiness:HealthcareManagementAndConsulting + - internationalBusiness:Management + - internationalBusiness:ManagementInformationSystems + - internationalBusiness:Marketing + - internationalBusiness:MarketingAnalytics + - internationalBusiness:SocialInnovationAndEntrepreneurship + - internationalBusiness:SupplyChainManagement + - journalism + - landscapeArchitecture + - linguistics + - marineBiology + - mathematics + - mechanicalEngineering + - mediaAndScreenStudies + - mediaArts + - music + - musicTechnology + - nursing + - pharmaceuticalSciences + - pharmacy(PharmD) + - philosophy + - physics + - politicalScience + - politicsPhilosophyEconomics + - psychology + - publicHealth + - publicRelations + - religiousStudies + - sociology + - spanish + - speechLanguagePathologyAndAudiology + - theatre maxLength: 255 major1: allOf: - - $ref: '#/definitions/models.Major' + - $ref: "#/definitions/models.Major" enum: - - africanaStudies - - americanSignLanguage - - americanSignLanguage-EnglishInterpreting - - appliedPhysics - - architecturalStudies - - architecture - - art:ArtVisualStudies - - behavioralNeuroscience - - biochemistry - - bioengineering - - biology - - biomedicalPhysics - - businessAdministration - - businessAdministration:Accounting - - businessAdministration:AccountingAndAdvisoryServices - - businessAdministration:BrandManagement - - businessAdministration:BusinessAnalytics - - businessAdministration:CorporateInnovation - - businessAdministration:EntrepreneurialStartups - - businessAdministration:FamilyBusiness - - businessAdministration:Finance - - businessAdministration:Fintech - - businessAdministration:HealthcareManagementAndConsulting - - businessAdministration:Management - - businessAdministration:ManagementInformationSystems - - businessAdministration:Marketing - - businessAdministration:MarketingAnalytics - - businessAdministration:SocialInnovationAndEntrepreneurship - - businessAdministration:SupplyChainManagement - - cellAndMolecularBiology - - chemicalEngineering - - chemistry - - civilEngineering - - communicationStudies - - computerEngineering - - computerScience - - computingAndLaw - - criminologyAndCriminalJustice - - culturalAnthropology - - cybersecurity - - dataScience - - design - - economics - - electricalEngineering - - english - - environmentalAndSustainabilityStudies - - environmentalEngineering - - environmentalScience - - environmentalStudies - - gameArtAndAnimation - - gameDesign - - globalAsianStudies - - healthScience - - history - - historyCultureAndLaw - - humanServices - - industrialEngineering - - internationalAffairs - - internationalBusiness - - internationalBusiness:Accounting - - internationalBusiness:AccountingAndAdvisoryServices - - internationalBusiness:BrandManagement - - internationalBusiness:BusinessAnalytics - - internationalBusiness:CorporateInnovation - - internationalBusiness:EntrepreneurialStartups - - internationalBusiness:FamilyBusiness - - internationalBusiness:Finance - - internationalBusiness:Fintech - - internationalBusiness:HealthcareManagementAndConsulting - - internationalBusiness:Management - - internationalBusiness:ManagementInformationSystems - - internationalBusiness:Marketing - - internationalBusiness:MarketingAnalytics - - internationalBusiness:SocialInnovationAndEntrepreneurship - - internationalBusiness:SupplyChainManagement - - journalism - - landscapeArchitecture - - linguistics - - marineBiology - - mathematics - - mechanicalEngineering - - mediaAndScreenStudies - - mediaArts - - music - - musicTechnology - - nursing - - pharmaceuticalSciences - - pharmacy(PharmD) - - philosophy - - physics - - politicalScience - - politicsPhilosophyEconomics - - psychology - - publicHealth - - publicRelations - - religiousStudies - - sociology - - spanish - - speechLanguagePathologyAndAudiology - - theatre + - africanaStudies + - americanSignLanguage + - americanSignLanguage-EnglishInterpreting + - appliedPhysics + - architecturalStudies + - architecture + - art:ArtVisualStudies + - behavioralNeuroscience + - biochemistry + - bioengineering + - biology + - biomedicalPhysics + - businessAdministration + - businessAdministration:Accounting + - businessAdministration:AccountingAndAdvisoryServices + - businessAdministration:BrandManagement + - businessAdministration:BusinessAnalytics + - businessAdministration:CorporateInnovation + - businessAdministration:EntrepreneurialStartups + - businessAdministration:FamilyBusiness + - businessAdministration:Finance + - businessAdministration:Fintech + - businessAdministration:HealthcareManagementAndConsulting + - businessAdministration:Management + - businessAdministration:ManagementInformationSystems + - businessAdministration:Marketing + - businessAdministration:MarketingAnalytics + - businessAdministration:SocialInnovationAndEntrepreneurship + - businessAdministration:SupplyChainManagement + - cellAndMolecularBiology + - chemicalEngineering + - chemistry + - civilEngineering + - communicationStudies + - computerEngineering + - computerScience + - computingAndLaw + - criminologyAndCriminalJustice + - culturalAnthropology + - cybersecurity + - dataScience + - design + - economics + - electricalEngineering + - english + - environmentalAndSustainabilityStudies + - environmentalEngineering + - environmentalScience + - environmentalStudies + - gameArtAndAnimation + - gameDesign + - globalAsianStudies + - healthScience + - history + - historyCultureAndLaw + - humanServices + - industrialEngineering + - internationalAffairs + - internationalBusiness + - internationalBusiness:Accounting + - internationalBusiness:AccountingAndAdvisoryServices + - internationalBusiness:BrandManagement + - internationalBusiness:BusinessAnalytics + - internationalBusiness:CorporateInnovation + - internationalBusiness:EntrepreneurialStartups + - internationalBusiness:FamilyBusiness + - internationalBusiness:Finance + - internationalBusiness:Fintech + - internationalBusiness:HealthcareManagementAndConsulting + - internationalBusiness:Management + - internationalBusiness:ManagementInformationSystems + - internationalBusiness:Marketing + - internationalBusiness:MarketingAnalytics + - internationalBusiness:SocialInnovationAndEntrepreneurship + - internationalBusiness:SupplyChainManagement + - journalism + - landscapeArchitecture + - linguistics + - marineBiology + - mathematics + - mechanicalEngineering + - mediaAndScreenStudies + - mediaArts + - music + - musicTechnology + - nursing + - pharmaceuticalSciences + - pharmacy(PharmD) + - philosophy + - physics + - politicalScience + - politicsPhilosophyEconomics + - psychology + - publicHealth + - publicRelations + - religiousStudies + - sociology + - spanish + - speechLanguagePathologyAndAudiology + - theatre maxLength: 255 major2: allOf: - - $ref: '#/definitions/models.Major' + - $ref: "#/definitions/models.Major" enum: - - africanaStudies - - americanSignLanguage - - americanSignLanguage-EnglishInterpreting - - appliedPhysics - - architecturalStudies - - architecture - - art:ArtVisualStudies - - behavioralNeuroscience - - biochemistry - - bioengineering - - biology - - biomedicalPhysics - - businessAdministration - - businessAdministration:Accounting - - businessAdministration:AccountingAndAdvisoryServices - - businessAdministration:BrandManagement - - businessAdministration:BusinessAnalytics - - businessAdministration:CorporateInnovation - - businessAdministration:EntrepreneurialStartups - - businessAdministration:FamilyBusiness - - businessAdministration:Finance - - businessAdministration:Fintech - - businessAdministration:HealthcareManagementAndConsulting - - businessAdministration:Management - - businessAdministration:ManagementInformationSystems - - businessAdministration:Marketing - - businessAdministration:MarketingAnalytics - - businessAdministration:SocialInnovationAndEntrepreneurship - - businessAdministration:SupplyChainManagement - - cellAndMolecularBiology - - chemicalEngineering - - chemistry - - civilEngineering - - communicationStudies - - computerEngineering - - computerScience - - computingAndLaw - - criminologyAndCriminalJustice - - culturalAnthropology - - cybersecurity - - dataScience - - design - - economics - - electricalEngineering - - english - - environmentalAndSustainabilityStudies - - environmentalEngineering - - environmentalScience - - environmentalStudies - - gameArtAndAnimation - - gameDesign - - globalAsianStudies - - healthScience - - history - - historyCultureAndLaw - - humanServices - - industrialEngineering - - internationalAffairs - - internationalBusiness - - internationalBusiness:Accounting - - internationalBusiness:AccountingAndAdvisoryServices - - internationalBusiness:BrandManagement - - internationalBusiness:BusinessAnalytics - - internationalBusiness:CorporateInnovation - - internationalBusiness:EntrepreneurialStartups - - internationalBusiness:FamilyBusiness - - internationalBusiness:Finance - - internationalBusiness:Fintech - - internationalBusiness:HealthcareManagementAndConsulting - - internationalBusiness:Management - - internationalBusiness:ManagementInformationSystems - - internationalBusiness:Marketing - - internationalBusiness:MarketingAnalytics - - internationalBusiness:SocialInnovationAndEntrepreneurship - - internationalBusiness:SupplyChainManagement - - journalism - - landscapeArchitecture - - linguistics - - marineBiology - - mathematics - - mechanicalEngineering - - mediaAndScreenStudies - - mediaArts - - music - - musicTechnology - - nursing - - pharmaceuticalSciences - - pharmacy(PharmD) - - philosophy - - physics - - politicalScience - - politicsPhilosophyEconomics - - psychology - - publicHealth - - publicRelations - - religiousStudies - - sociology - - spanish - - speechLanguagePathologyAndAudiology - - theatre + - africanaStudies + - americanSignLanguage + - americanSignLanguage-EnglishInterpreting + - appliedPhysics + - architecturalStudies + - architecture + - art:ArtVisualStudies + - behavioralNeuroscience + - biochemistry + - bioengineering + - biology + - biomedicalPhysics + - businessAdministration + - businessAdministration:Accounting + - businessAdministration:AccountingAndAdvisoryServices + - businessAdministration:BrandManagement + - businessAdministration:BusinessAnalytics + - businessAdministration:CorporateInnovation + - businessAdministration:EntrepreneurialStartups + - businessAdministration:FamilyBusiness + - businessAdministration:Finance + - businessAdministration:Fintech + - businessAdministration:HealthcareManagementAndConsulting + - businessAdministration:Management + - businessAdministration:ManagementInformationSystems + - businessAdministration:Marketing + - businessAdministration:MarketingAnalytics + - businessAdministration:SocialInnovationAndEntrepreneurship + - businessAdministration:SupplyChainManagement + - cellAndMolecularBiology + - chemicalEngineering + - chemistry + - civilEngineering + - communicationStudies + - computerEngineering + - computerScience + - computingAndLaw + - criminologyAndCriminalJustice + - culturalAnthropology + - cybersecurity + - dataScience + - design + - economics + - electricalEngineering + - english + - environmentalAndSustainabilityStudies + - environmentalEngineering + - environmentalScience + - environmentalStudies + - gameArtAndAnimation + - gameDesign + - globalAsianStudies + - healthScience + - history + - historyCultureAndLaw + - humanServices + - industrialEngineering + - internationalAffairs + - internationalBusiness + - internationalBusiness:Accounting + - internationalBusiness:AccountingAndAdvisoryServices + - internationalBusiness:BrandManagement + - internationalBusiness:BusinessAnalytics + - internationalBusiness:CorporateInnovation + - internationalBusiness:EntrepreneurialStartups + - internationalBusiness:FamilyBusiness + - internationalBusiness:Finance + - internationalBusiness:Fintech + - internationalBusiness:HealthcareManagementAndConsulting + - internationalBusiness:Management + - internationalBusiness:ManagementInformationSystems + - internationalBusiness:Marketing + - internationalBusiness:MarketingAnalytics + - internationalBusiness:SocialInnovationAndEntrepreneurship + - internationalBusiness:SupplyChainManagement + - journalism + - landscapeArchitecture + - linguistics + - marineBiology + - mathematics + - mechanicalEngineering + - mediaAndScreenStudies + - mediaArts + - music + - musicTechnology + - nursing + - pharmaceuticalSciences + - pharmacy(PharmD) + - philosophy + - physics + - politicalScience + - politicsPhilosophyEconomics + - psychology + - publicHealth + - publicRelations + - religiousStudies + - sociology + - spanish + - speechLanguagePathologyAndAudiology + - theatre maxLength: 255 password: - description: 'MARK: must be validated manually' + description: "MARK: must be validated manually" maxLength: 255 type: string required: - - email - - first_name - - last_name - - password + - email + - first_name + - last_name + - password type: object models.Event: properties: @@ -695,10 +695,10 @@ definitions: type: string event_type: allOf: - - $ref: '#/definitions/models.EventType' + - $ref: "#/definitions/models.EventType" enum: - - open - - membersOnly + - open + - membersOnly maxLength: 255 host: type: string @@ -724,22 +724,22 @@ definitions: example: "2023-09-20T16:34:50Z" type: string required: - - content - - end_time - - event_type - - location - - name - - preview - - start_time + - content + - end_time + - event_type + - location + - name + - preview + - start_time type: object models.EventType: enum: - - open - - membersOnly + - open + - membersOnly type: string x-enum-varnames: - - Open - - MembersOnly + - Open + - MembersOnly models.File: properties: created_at: @@ -767,236 +767,236 @@ definitions: example: "2023-09-20T16:34:50Z" type: string required: - - file_name - - file_size - - file_type - - file_url - - object_key + - file_name + - file_size + - file_type + - file_url + - object_key type: object models.GraduationCycle: enum: - - december - - may + - december + - may type: string x-enum-varnames: - - December - - May - models.LoginUserResponseBody: + - December + - May + models.LoginResponseBody: properties: email: type: string password: - description: 'MARK: must be validated manually' + description: "MARK: must be validated manually" maxLength: 255 type: string required: - - email - - password + - email + - password type: object models.Major: enum: - - africanaStudies - - americanSignLanguage - - americanSignLanguage-EnglishInterpreting - - appliedPhysics - - architecturalStudies - - architecture - - art:ArtVisualStudies - - behavioralNeuroscience - - biochemistry - - bioengineering - - biology - - biomedicalPhysics - - businessAdministration - - businessAdministration:Accounting - - businessAdministration:AccountingAndAdvisoryServices - - businessAdministration:BrandManagement - - businessAdministration:BusinessAnalytics - - businessAdministration:CorporateInnovation - - businessAdministration:EntrepreneurialStartups - - businessAdministration:FamilyBusiness - - businessAdministration:Finance - - businessAdministration:Fintech - - businessAdministration:HealthcareManagementAndConsulting - - businessAdministration:Management - - businessAdministration:ManagementInformationSystems - - businessAdministration:Marketing - - businessAdministration:MarketingAnalytics - - businessAdministration:SocialInnovationAndEntrepreneurship - - businessAdministration:SupplyChainManagement - - cellAndMolecularBiology - - chemicalEngineering - - chemistry - - civilEngineering - - communicationStudies - - computerEngineering - - computerScience - - computingAndLaw - - criminologyAndCriminalJustice - - culturalAnthropology - - cybersecurity - - dataScience - - design - - economics - - electricalEngineering - - english - - environmentalAndSustainabilityStudies - - environmentalEngineering - - environmentalScience - - environmentalStudies - - gameArtAndAnimation - - gameDesign - - globalAsianStudies - - healthScience - - history - - historyCultureAndLaw - - humanServices - - industrialEngineering - - internationalAffairs - - internationalBusiness - - internationalBusiness:Accounting - - internationalBusiness:AccountingAndAdvisoryServices - - internationalBusiness:BrandManagement - - internationalBusiness:BusinessAnalytics - - internationalBusiness:CorporateInnovation - - internationalBusiness:EntrepreneurialStartups - - internationalBusiness:FamilyBusiness - - internationalBusiness:Finance - - internationalBusiness:Fintech - - internationalBusiness:HealthcareManagementAndConsulting - - internationalBusiness:Management - - internationalBusiness:ManagementInformationSystems - - internationalBusiness:Marketing - - internationalBusiness:MarketingAnalytics - - internationalBusiness:SocialInnovationAndEntrepreneurship - - internationalBusiness:SupplyChainManagement - - journalism - - landscapeArchitecture - - linguistics - - marineBiology - - mathematics - - mechanicalEngineering - - mediaAndScreenStudies - - mediaArts - - music - - musicTechnology - - nursing - - pharmaceuticalSciences - - pharmacy(PharmD) - - philosophy - - physics - - politicalScience - - politicsPhilosophyEconomics - - psychology - - publicHealth - - publicRelations - - religiousStudies - - sociology - - spanish - - speechLanguagePathologyAndAudiology - - theatre + - africanaStudies + - americanSignLanguage + - americanSignLanguage-EnglishInterpreting + - appliedPhysics + - architecturalStudies + - architecture + - art:ArtVisualStudies + - behavioralNeuroscience + - biochemistry + - bioengineering + - biology + - biomedicalPhysics + - businessAdministration + - businessAdministration:Accounting + - businessAdministration:AccountingAndAdvisoryServices + - businessAdministration:BrandManagement + - businessAdministration:BusinessAnalytics + - businessAdministration:CorporateInnovation + - businessAdministration:EntrepreneurialStartups + - businessAdministration:FamilyBusiness + - businessAdministration:Finance + - businessAdministration:Fintech + - businessAdministration:HealthcareManagementAndConsulting + - businessAdministration:Management + - businessAdministration:ManagementInformationSystems + - businessAdministration:Marketing + - businessAdministration:MarketingAnalytics + - businessAdministration:SocialInnovationAndEntrepreneurship + - businessAdministration:SupplyChainManagement + - cellAndMolecularBiology + - chemicalEngineering + - chemistry + - civilEngineering + - communicationStudies + - computerEngineering + - computerScience + - computingAndLaw + - criminologyAndCriminalJustice + - culturalAnthropology + - cybersecurity + - dataScience + - design + - economics + - electricalEngineering + - english + - environmentalAndSustainabilityStudies + - environmentalEngineering + - environmentalScience + - environmentalStudies + - gameArtAndAnimation + - gameDesign + - globalAsianStudies + - healthScience + - history + - historyCultureAndLaw + - humanServices + - industrialEngineering + - internationalAffairs + - internationalBusiness + - internationalBusiness:Accounting + - internationalBusiness:AccountingAndAdvisoryServices + - internationalBusiness:BrandManagement + - internationalBusiness:BusinessAnalytics + - internationalBusiness:CorporateInnovation + - internationalBusiness:EntrepreneurialStartups + - internationalBusiness:FamilyBusiness + - internationalBusiness:Finance + - internationalBusiness:Fintech + - internationalBusiness:HealthcareManagementAndConsulting + - internationalBusiness:Management + - internationalBusiness:ManagementInformationSystems + - internationalBusiness:Marketing + - internationalBusiness:MarketingAnalytics + - internationalBusiness:SocialInnovationAndEntrepreneurship + - internationalBusiness:SupplyChainManagement + - journalism + - landscapeArchitecture + - linguistics + - marineBiology + - mathematics + - mechanicalEngineering + - mediaAndScreenStudies + - mediaArts + - music + - musicTechnology + - nursing + - pharmaceuticalSciences + - pharmacy(PharmD) + - philosophy + - physics + - politicalScience + - politicsPhilosophyEconomics + - psychology + - publicHealth + - publicRelations + - religiousStudies + - sociology + - spanish + - speechLanguagePathologyAndAudiology + - theatre type: string x-enum-varnames: - - AfricanaStudies - - AmericanSignLanguage - - AmericanSignLanguageEnglishInterpreting - - AppliedPhysics - - ArchitecturalStudies - - Architecture - - ArtArtVisualStudies - - BehavioralNeuroscience - - Biochemistry - - Bioengineering - - Biology - - BiomedicalPhysics - - BusinessAdministration - - BusinessAdministrationAccounting - - BusinessAdministrationAccountingAndAdvisoryServices - - BusinessAdministrationBrandManagement - - BusinessAdministrationBusinessAnalytics - - BusinessAdministrationCorporateInnovation - - BusinessAdministrationEntrepreneurialStartups - - BusinessAdministrationFamilyBusiness - - BusinessAdministrationFinance - - BusinessAdministrationFintech - - BusinessAdministrationHealthcareManagementAndConsulting - - BusinessAdministrationManagement - - BusinessAdministrationManagementInformationSystems - - BusinessAdministrationMarketing - - BusinessAdministrationMarketingAnalytics - - BusinessAdministrationSocialInnovationAndEntrepreneurship - - BusinessAdministrationSupplyChainManagement - - CellAndMolecularBiology - - ChemicalEngineering - - Chemistry - - CivilEngineering - - CommunicationStudies - - ComputerEngineering - - ComputerScience - - ComputingAndLaw - - CriminologyAndCriminalJustice - - CulturalAnthropology - - Cybersecurity - - DataScience - - Design - - Economics - - ElectricalEngineering - - English - - EnvironmentalAndSustainabilityStudies - - EnvironmentalEngineering - - EnvironmentalScience - - EnvironmentalStudies - - GameArtAndAnimation - - GameDesign - - GlobalAsianStudies - - HealthScience - - History - - HistoryCultureAndLaw - - HumanServices - - IndustrialEngineering - - InternationalAffairs - - InternationalBusiness - - InternationalBusinessAccounting - - InternationalBusinessAccountingAndAdvisoryServices - - InternationalBusinessBrandManagement - - InternationalBusinessBusinessAnalytics - - InternationalBusinessCorporateInnovation - - InternationalBusinessEntrepreneurialStartups - - InternationalBusinessFamilyBusiness - - InternationalBusinessFinance - - InternationalBusinessFintech - - InternationalBusinessHealthcareManagementAndConsulting - - InternationalBusinessManagement - - InternationalBusinessManagementInformationSystems - - InternationalBusinessMarketing - - InternationalBusinessMarketingAnalytics - - InternationalBusinessSocialInnovationAndEntrepreneurship - - InternationalBusinessSupplyChainManagement - - Journalism - - LandscapeArchitecture - - Linguistics - - MarineBiology - - Mathematics - - MechanicalEngineering - - MediaAndScreenStudies - - MediaArts - - Music - - MusicTechnology - - Nursing - - PharmaceuticalSciences - - PharmacyPharmD - - Philosophy - - Physics - - PoliticalScience - - PoliticsPhilosophyEconomics - - Psychology - - PublicHealth - - PublicRelations - - ReligiousStudies - - Sociology - - Spanish - - SpeechLanguagePathologyAndAudiology - - Theatre + - AfricanaStudies + - AmericanSignLanguage + - AmericanSignLanguageEnglishInterpreting + - AppliedPhysics + - ArchitecturalStudies + - Architecture + - ArtArtVisualStudies + - BehavioralNeuroscience + - Biochemistry + - Bioengineering + - Biology + - BiomedicalPhysics + - BusinessAdministration + - BusinessAdministrationAccounting + - BusinessAdministrationAccountingAndAdvisoryServices + - BusinessAdministrationBrandManagement + - BusinessAdministrationBusinessAnalytics + - BusinessAdministrationCorporateInnovation + - BusinessAdministrationEntrepreneurialStartups + - BusinessAdministrationFamilyBusiness + - BusinessAdministrationFinance + - BusinessAdministrationFintech + - BusinessAdministrationHealthcareManagementAndConsulting + - BusinessAdministrationManagement + - BusinessAdministrationManagementInformationSystems + - BusinessAdministrationMarketing + - BusinessAdministrationMarketingAnalytics + - BusinessAdministrationSocialInnovationAndEntrepreneurship + - BusinessAdministrationSupplyChainManagement + - CellAndMolecularBiology + - ChemicalEngineering + - Chemistry + - CivilEngineering + - CommunicationStudies + - ComputerEngineering + - ComputerScience + - ComputingAndLaw + - CriminologyAndCriminalJustice + - CulturalAnthropology + - Cybersecurity + - DataScience + - Design + - Economics + - ElectricalEngineering + - English + - EnvironmentalAndSustainabilityStudies + - EnvironmentalEngineering + - EnvironmentalScience + - EnvironmentalStudies + - GameArtAndAnimation + - GameDesign + - GlobalAsianStudies + - HealthScience + - History + - HistoryCultureAndLaw + - HumanServices + - IndustrialEngineering + - InternationalAffairs + - InternationalBusiness + - InternationalBusinessAccounting + - InternationalBusinessAccountingAndAdvisoryServices + - InternationalBusinessBrandManagement + - InternationalBusinessBusinessAnalytics + - InternationalBusinessCorporateInnovation + - InternationalBusinessEntrepreneurialStartups + - InternationalBusinessFamilyBusiness + - InternationalBusinessFinance + - InternationalBusinessFintech + - InternationalBusinessHealthcareManagementAndConsulting + - InternationalBusinessManagement + - InternationalBusinessManagementInformationSystems + - InternationalBusinessMarketing + - InternationalBusinessMarketingAnalytics + - InternationalBusinessSocialInnovationAndEntrepreneurship + - InternationalBusinessSupplyChainManagement + - Journalism + - LandscapeArchitecture + - Linguistics + - MarineBiology + - Mathematics + - MechanicalEngineering + - MediaAndScreenStudies + - MediaArts + - Music + - MusicTechnology + - Nursing + - PharmaceuticalSciences + - PharmacyPharmD + - Philosophy + - Physics + - PoliticalScience + - PoliticsPhilosophyEconomics + - Psychology + - PublicHealth + - PublicRelations + - ReligiousStudies + - Sociology + - Spanish + - SpeechLanguagePathologyAndAudiology + - Theatre models.PointOfContact: properties: created_at: @@ -1012,7 +1012,7 @@ definitions: maxLength: 255 type: string photo_file: - $ref: '#/definitions/models.File' + $ref: "#/definitions/models.File" position: maxLength: 255 type: string @@ -1020,66 +1020,66 @@ definitions: example: "2023-09-20T16:34:50Z" type: string required: - - email - - name - - position + - email + - name + - position type: object - models.PutContactRequestBody: + PutContactRequestBody: properties: content: maxLength: 255 type: string type: allOf: - - $ref: '#/definitions/models.ContactType' + - $ref: "#/definitions/models.ContactType" enum: - - facebook - - instagram - - x - - linkedin - - youtube - - github - - slack - - discord - - email - - customSite + - facebook + - instagram + - x + - linkedin + - youtube + - github + - slack + - discord + - email + - customSite maxLength: 255 required: - - content - - type + - content + - type type: object models.RecruitmentCycle: enum: - - fall - - spring - - fallSpring - - always + - fall + - spring + - fallSpring + - always type: string x-enum-varnames: - - Fall - - Spring - - FallSpring - - Always + - Fall + - Spring + - FallSpring + - Always models.RecruitmentType: enum: - - unrestricted - - tryout - - application + - unrestricted + - tryout + - application type: string x-enum-varnames: - - Unrestricted - - Tryout - - Application + - Unrestricted + - Tryout + - Application models.RecurringType: enum: - - daily - - weekly - - monthly + - daily + - weekly + - monthly type: string x-enum-varnames: - - Daily - - Weekly - - Monthly + - Daily + - Weekly + - Monthly models.Series: properties: created_at: @@ -1087,7 +1087,7 @@ definitions: type: string events: items: - $ref: '#/definitions/models.Event' + $ref: "#/definitions/models.Event" type: array id: example: 123e4567-e89b-12d3-a456-426614174000 @@ -1097,7 +1097,7 @@ definitions: type: integer recurring_type: allOf: - - $ref: '#/definitions/models.RecurringType' + - $ref: "#/definitions/models.RecurringType" maxLength: 255 updated_at: example: "2023-09-20T16:34:50Z" @@ -1120,10 +1120,10 @@ definitions: example: "2023-09-20T16:34:50Z" type: string required: - - category_id - - name + - category_id + - name type: object - models.UpdateClubRequestBody: + UpdateClubRequestBody: properties: application_link: maxLength: 255 @@ -1147,30 +1147,30 @@ definitions: type: string recruitment_cycle: allOf: - - $ref: '#/definitions/models.RecruitmentCycle' + - $ref: "#/definitions/models.RecruitmentCycle" enum: - - fall - - spring - - fallSpring - - always + - fall + - spring + - fallSpring + - always maxLength: 255 recruitment_type: allOf: - - $ref: '#/definitions/models.RecruitmentType' + - $ref: "#/definitions/models.RecruitmentType" enum: - - unrestricted - - tryout - - application + - unrestricted + - tryout + - application maxLength: 255 weekly_time_commitment: minimum: 1 type: integer required: - - application_link - - recruitment_cycle - - recruitment_type + - application_link + - recruitment_cycle + - recruitment_type type: object - models.UpdateEventRequestBody: + events.UpdateEventRequestBody: properties: content: maxLength: 255 @@ -1179,10 +1179,10 @@ definitions: type: string event_type: allOf: - - $ref: '#/definitions/models.EventType' + - $ref: "#/definitions/models.EventType" enum: - - open - - membersOnly + - open + - membersOnly maxLength: 255 host: type: string @@ -1201,34 +1201,34 @@ definitions: models.UpdatePasswordRequestBody: properties: new_password: - description: 'MARK: must be validated manually' + description: "MARK: must be validated manually" maxLength: 255 type: string old_password: - description: 'MARK: must be validated manually' + description: "MARK: must be validated manually" maxLength: 255 type: string required: - - new_password - - old_password + - new_password + - old_password type: object models.UpdateSeriesRequestBody: properties: event_details: - $ref: '#/definitions/models.UpdateEventRequestBody' + $ref: "#/definitions/events.UpdateEventRequestBody" max_occurrences: minimum: 2 type: integer recurring_type: allOf: - - $ref: '#/definitions/models.RecurringType' + - $ref: "#/definitions/models.RecurringType" enum: - - daily - - weekly - - monthly + - daily + - weekly + - monthly maxLength: 255 type: object - models.UpdateTagRequestBody: + UpdateTagRequestBody: properties: category_id: type: string @@ -1236,30 +1236,30 @@ definitions: maxLength: 255 type: string type: object - models.UpdateUserRequestBody: + UpdateUserRequestBody: properties: college: allOf: - - $ref: '#/definitions/models.College' + - $ref: "#/definitions/models.College" enum: - - CAMD - - DMSB - - KCCS - - CE - - BCHS - - SL - - CPS - - CS - - CSSH + - CAMD + - DMSB + - KCCS + - CE + - BCHS + - SL + - CPS + - CS + - CSSH first_name: maxLength: 255 type: string graduation_cycle: allOf: - - $ref: '#/definitions/models.GraduationCycle' + - $ref: "#/definitions/models.GraduationCycle" enum: - - december - - may + - december + - may maxLength: 255 graduation_year: type: integer @@ -1268,325 +1268,325 @@ definitions: type: string major0: allOf: - - $ref: '#/definitions/models.Major' + - $ref: "#/definitions/models.Major" enum: - - africanaStudies - - americanSignLanguage - - americanSignLanguage-EnglishInterpreting - - appliedPhysics - - architecturalStudies - - architecture - - art:ArtVisualStudies - - behavioralNeuroscience - - biochemistry - - bioengineering - - biology - - biomedicalPhysics - - businessAdministration - - businessAdministration:Accounting - - businessAdministration:AccountingAndAdvisoryServices - - businessAdministration:BrandManagement - - businessAdministration:BusinessAnalytics - - businessAdministration:CorporateInnovation - - businessAdministration:EntrepreneurialStartups - - businessAdministration:FamilyBusiness - - businessAdministration:Finance - - businessAdministration:Fintech - - businessAdministration:HealthcareManagementAndConsulting - - businessAdministration:Management - - businessAdministration:ManagementInformationSystems - - businessAdministration:Marketing - - businessAdministration:MarketingAnalytics - - businessAdministration:SocialInnovationAndEntrepreneurship - - businessAdministration:SupplyChainManagement - - cellAndMolecularBiology - - chemicalEngineering - - chemistry - - civilEngineering - - communicationStudies - - computerEngineering - - computerScience - - computingAndLaw - - criminologyAndCriminalJustice - - culturalAnthropology - - cybersecurity - - dataScience - - design - - economics - - electricalEngineering - - english - - environmentalAndSustainabilityStudies - - environmentalEngineering - - environmentalScience - - environmentalStudies - - gameArtAndAnimation - - gameDesign - - globalAsianStudies - - healthScience - - history - - historyCultureAndLaw - - humanServices - - industrialEngineering - - internationalAffairs - - internationalBusiness - - internationalBusiness:Accounting - - internationalBusiness:AccountingAndAdvisoryServices - - internationalBusiness:BrandManagement - - internationalBusiness:BusinessAnalytics - - internationalBusiness:CorporateInnovation - - internationalBusiness:EntrepreneurialStartups - - internationalBusiness:FamilyBusiness - - internationalBusiness:Finance - - internationalBusiness:Fintech - - internationalBusiness:HealthcareManagementAndConsulting - - internationalBusiness:Management - - internationalBusiness:ManagementInformationSystems - - internationalBusiness:Marketing - - internationalBusiness:MarketingAnalytics - - internationalBusiness:SocialInnovationAndEntrepreneurship - - internationalBusiness:SupplyChainManagement - - journalism - - landscapeArchitecture - - linguistics - - marineBiology - - mathematics - - mechanicalEngineering - - mediaAndScreenStudies - - mediaArts - - music - - musicTechnology - - nursing - - pharmaceuticalSciences - - pharmacy(PharmD) - - philosophy - - physics - - politicalScience - - politicsPhilosophyEconomics - - psychology - - publicHealth - - publicRelations - - religiousStudies - - sociology - - spanish - - speechLanguagePathologyAndAudiology - - theatre + - africanaStudies + - americanSignLanguage + - americanSignLanguage-EnglishInterpreting + - appliedPhysics + - architecturalStudies + - architecture + - art:ArtVisualStudies + - behavioralNeuroscience + - biochemistry + - bioengineering + - biology + - biomedicalPhysics + - businessAdministration + - businessAdministration:Accounting + - businessAdministration:AccountingAndAdvisoryServices + - businessAdministration:BrandManagement + - businessAdministration:BusinessAnalytics + - businessAdministration:CorporateInnovation + - businessAdministration:EntrepreneurialStartups + - businessAdministration:FamilyBusiness + - businessAdministration:Finance + - businessAdministration:Fintech + - businessAdministration:HealthcareManagementAndConsulting + - businessAdministration:Management + - businessAdministration:ManagementInformationSystems + - businessAdministration:Marketing + - businessAdministration:MarketingAnalytics + - businessAdministration:SocialInnovationAndEntrepreneurship + - businessAdministration:SupplyChainManagement + - cellAndMolecularBiology + - chemicalEngineering + - chemistry + - civilEngineering + - communicationStudies + - computerEngineering + - computerScience + - computingAndLaw + - criminologyAndCriminalJustice + - culturalAnthropology + - cybersecurity + - dataScience + - design + - economics + - electricalEngineering + - english + - environmentalAndSustainabilityStudies + - environmentalEngineering + - environmentalScience + - environmentalStudies + - gameArtAndAnimation + - gameDesign + - globalAsianStudies + - healthScience + - history + - historyCultureAndLaw + - humanServices + - industrialEngineering + - internationalAffairs + - internationalBusiness + - internationalBusiness:Accounting + - internationalBusiness:AccountingAndAdvisoryServices + - internationalBusiness:BrandManagement + - internationalBusiness:BusinessAnalytics + - internationalBusiness:CorporateInnovation + - internationalBusiness:EntrepreneurialStartups + - internationalBusiness:FamilyBusiness + - internationalBusiness:Finance + - internationalBusiness:Fintech + - internationalBusiness:HealthcareManagementAndConsulting + - internationalBusiness:Management + - internationalBusiness:ManagementInformationSystems + - internationalBusiness:Marketing + - internationalBusiness:MarketingAnalytics + - internationalBusiness:SocialInnovationAndEntrepreneurship + - internationalBusiness:SupplyChainManagement + - journalism + - landscapeArchitecture + - linguistics + - marineBiology + - mathematics + - mechanicalEngineering + - mediaAndScreenStudies + - mediaArts + - music + - musicTechnology + - nursing + - pharmaceuticalSciences + - pharmacy(PharmD) + - philosophy + - physics + - politicalScience + - politicsPhilosophyEconomics + - psychology + - publicHealth + - publicRelations + - religiousStudies + - sociology + - spanish + - speechLanguagePathologyAndAudiology + - theatre maxLength: 255 major1: allOf: - - $ref: '#/definitions/models.Major' + - $ref: "#/definitions/models.Major" enum: - - africanaStudies - - americanSignLanguage - - americanSignLanguage-EnglishInterpreting - - appliedPhysics - - architecturalStudies - - architecture - - art:ArtVisualStudies - - behavioralNeuroscience - - biochemistry - - bioengineering - - biology - - biomedicalPhysics - - businessAdministration - - businessAdministration:Accounting - - businessAdministration:AccountingAndAdvisoryServices - - businessAdministration:BrandManagement - - businessAdministration:BusinessAnalytics - - businessAdministration:CorporateInnovation - - businessAdministration:EntrepreneurialStartups - - businessAdministration:FamilyBusiness - - businessAdministration:Finance - - businessAdministration:Fintech - - businessAdministration:HealthcareManagementAndConsulting - - businessAdministration:Management - - businessAdministration:ManagementInformationSystems - - businessAdministration:Marketing - - businessAdministration:MarketingAnalytics - - businessAdministration:SocialInnovationAndEntrepreneurship - - businessAdministration:SupplyChainManagement - - cellAndMolecularBiology - - chemicalEngineering - - chemistry - - civilEngineering - - communicationStudies - - computerEngineering - - computerScience - - computingAndLaw - - criminologyAndCriminalJustice - - culturalAnthropology - - cybersecurity - - dataScience - - design - - economics - - electricalEngineering - - english - - environmentalAndSustainabilityStudies - - environmentalEngineering - - environmentalScience - - environmentalStudies - - gameArtAndAnimation - - gameDesign - - globalAsianStudies - - healthScience - - history - - historyCultureAndLaw - - humanServices - - industrialEngineering - - internationalAffairs - - internationalBusiness - - internationalBusiness:Accounting - - internationalBusiness:AccountingAndAdvisoryServices - - internationalBusiness:BrandManagement - - internationalBusiness:BusinessAnalytics - - internationalBusiness:CorporateInnovation - - internationalBusiness:EntrepreneurialStartups - - internationalBusiness:FamilyBusiness - - internationalBusiness:Finance - - internationalBusiness:Fintech - - internationalBusiness:HealthcareManagementAndConsulting - - internationalBusiness:Management - - internationalBusiness:ManagementInformationSystems - - internationalBusiness:Marketing - - internationalBusiness:MarketingAnalytics - - internationalBusiness:SocialInnovationAndEntrepreneurship - - internationalBusiness:SupplyChainManagement - - journalism - - landscapeArchitecture - - linguistics - - marineBiology - - mathematics - - mechanicalEngineering - - mediaAndScreenStudies - - mediaArts - - music - - musicTechnology - - nursing - - pharmaceuticalSciences - - pharmacy(PharmD) - - philosophy - - physics - - politicalScience - - politicsPhilosophyEconomics - - psychology - - publicHealth - - publicRelations - - religiousStudies - - sociology - - spanish - - speechLanguagePathologyAndAudiology - - theatre + - africanaStudies + - americanSignLanguage + - americanSignLanguage-EnglishInterpreting + - appliedPhysics + - architecturalStudies + - architecture + - art:ArtVisualStudies + - behavioralNeuroscience + - biochemistry + - bioengineering + - biology + - biomedicalPhysics + - businessAdministration + - businessAdministration:Accounting + - businessAdministration:AccountingAndAdvisoryServices + - businessAdministration:BrandManagement + - businessAdministration:BusinessAnalytics + - businessAdministration:CorporateInnovation + - businessAdministration:EntrepreneurialStartups + - businessAdministration:FamilyBusiness + - businessAdministration:Finance + - businessAdministration:Fintech + - businessAdministration:HealthcareManagementAndConsulting + - businessAdministration:Management + - businessAdministration:ManagementInformationSystems + - businessAdministration:Marketing + - businessAdministration:MarketingAnalytics + - businessAdministration:SocialInnovationAndEntrepreneurship + - businessAdministration:SupplyChainManagement + - cellAndMolecularBiology + - chemicalEngineering + - chemistry + - civilEngineering + - communicationStudies + - computerEngineering + - computerScience + - computingAndLaw + - criminologyAndCriminalJustice + - culturalAnthropology + - cybersecurity + - dataScience + - design + - economics + - electricalEngineering + - english + - environmentalAndSustainabilityStudies + - environmentalEngineering + - environmentalScience + - environmentalStudies + - gameArtAndAnimation + - gameDesign + - globalAsianStudies + - healthScience + - history + - historyCultureAndLaw + - humanServices + - industrialEngineering + - internationalAffairs + - internationalBusiness + - internationalBusiness:Accounting + - internationalBusiness:AccountingAndAdvisoryServices + - internationalBusiness:BrandManagement + - internationalBusiness:BusinessAnalytics + - internationalBusiness:CorporateInnovation + - internationalBusiness:EntrepreneurialStartups + - internationalBusiness:FamilyBusiness + - internationalBusiness:Finance + - internationalBusiness:Fintech + - internationalBusiness:HealthcareManagementAndConsulting + - internationalBusiness:Management + - internationalBusiness:ManagementInformationSystems + - internationalBusiness:Marketing + - internationalBusiness:MarketingAnalytics + - internationalBusiness:SocialInnovationAndEntrepreneurship + - internationalBusiness:SupplyChainManagement + - journalism + - landscapeArchitecture + - linguistics + - marineBiology + - mathematics + - mechanicalEngineering + - mediaAndScreenStudies + - mediaArts + - music + - musicTechnology + - nursing + - pharmaceuticalSciences + - pharmacy(PharmD) + - philosophy + - physics + - politicalScience + - politicsPhilosophyEconomics + - psychology + - publicHealth + - publicRelations + - religiousStudies + - sociology + - spanish + - speechLanguagePathologyAndAudiology + - theatre maxLength: 255 major2: allOf: - - $ref: '#/definitions/models.Major' + - $ref: "#/definitions/models.Major" enum: - - africanaStudies - - americanSignLanguage - - americanSignLanguage-EnglishInterpreting - - appliedPhysics - - architecturalStudies - - architecture - - art:ArtVisualStudies - - behavioralNeuroscience - - biochemistry - - bioengineering - - biology - - biomedicalPhysics - - businessAdministration - - businessAdministration:Accounting - - businessAdministration:AccountingAndAdvisoryServices - - businessAdministration:BrandManagement - - businessAdministration:BusinessAnalytics - - businessAdministration:CorporateInnovation - - businessAdministration:EntrepreneurialStartups - - businessAdministration:FamilyBusiness - - businessAdministration:Finance - - businessAdministration:Fintech - - businessAdministration:HealthcareManagementAndConsulting - - businessAdministration:Management - - businessAdministration:ManagementInformationSystems - - businessAdministration:Marketing - - businessAdministration:MarketingAnalytics - - businessAdministration:SocialInnovationAndEntrepreneurship - - businessAdministration:SupplyChainManagement - - cellAndMolecularBiology - - chemicalEngineering - - chemistry - - civilEngineering - - communicationStudies - - computerEngineering - - computerScience - - computingAndLaw - - criminologyAndCriminalJustice - - culturalAnthropology - - cybersecurity - - dataScience - - design - - economics - - electricalEngineering - - english - - environmentalAndSustainabilityStudies - - environmentalEngineering - - environmentalScience - - environmentalStudies - - gameArtAndAnimation - - gameDesign - - globalAsianStudies - - healthScience - - history - - historyCultureAndLaw - - humanServices - - industrialEngineering - - internationalAffairs - - internationalBusiness - - internationalBusiness:Accounting - - internationalBusiness:AccountingAndAdvisoryServices - - internationalBusiness:BrandManagement - - internationalBusiness:BusinessAnalytics - - internationalBusiness:CorporateInnovation - - internationalBusiness:EntrepreneurialStartups - - internationalBusiness:FamilyBusiness - - internationalBusiness:Finance - - internationalBusiness:Fintech - - internationalBusiness:HealthcareManagementAndConsulting - - internationalBusiness:Management - - internationalBusiness:ManagementInformationSystems - - internationalBusiness:Marketing - - internationalBusiness:MarketingAnalytics - - internationalBusiness:SocialInnovationAndEntrepreneurship - - internationalBusiness:SupplyChainManagement - - journalism - - landscapeArchitecture - - linguistics - - marineBiology - - mathematics - - mechanicalEngineering - - mediaAndScreenStudies - - mediaArts - - music - - musicTechnology - - nursing - - pharmaceuticalSciences - - pharmacy(PharmD) - - philosophy - - physics - - politicalScience - - politicsPhilosophyEconomics - - psychology - - publicHealth - - publicRelations - - religiousStudies - - sociology - - spanish - - speechLanguagePathologyAndAudiology - - theatre + - africanaStudies + - americanSignLanguage + - americanSignLanguage-EnglishInterpreting + - appliedPhysics + - architecturalStudies + - architecture + - art:ArtVisualStudies + - behavioralNeuroscience + - biochemistry + - bioengineering + - biology + - biomedicalPhysics + - businessAdministration + - businessAdministration:Accounting + - businessAdministration:AccountingAndAdvisoryServices + - businessAdministration:BrandManagement + - businessAdministration:BusinessAnalytics + - businessAdministration:CorporateInnovation + - businessAdministration:EntrepreneurialStartups + - businessAdministration:FamilyBusiness + - businessAdministration:Finance + - businessAdministration:Fintech + - businessAdministration:HealthcareManagementAndConsulting + - businessAdministration:Management + - businessAdministration:ManagementInformationSystems + - businessAdministration:Marketing + - businessAdministration:MarketingAnalytics + - businessAdministration:SocialInnovationAndEntrepreneurship + - businessAdministration:SupplyChainManagement + - cellAndMolecularBiology + - chemicalEngineering + - chemistry + - civilEngineering + - communicationStudies + - computerEngineering + - computerScience + - computingAndLaw + - criminologyAndCriminalJustice + - culturalAnthropology + - cybersecurity + - dataScience + - design + - economics + - electricalEngineering + - english + - environmentalAndSustainabilityStudies + - environmentalEngineering + - environmentalScience + - environmentalStudies + - gameArtAndAnimation + - gameDesign + - globalAsianStudies + - healthScience + - history + - historyCultureAndLaw + - humanServices + - industrialEngineering + - internationalAffairs + - internationalBusiness + - internationalBusiness:Accounting + - internationalBusiness:AccountingAndAdvisoryServices + - internationalBusiness:BrandManagement + - internationalBusiness:BusinessAnalytics + - internationalBusiness:CorporateInnovation + - internationalBusiness:EntrepreneurialStartups + - internationalBusiness:FamilyBusiness + - internationalBusiness:Finance + - internationalBusiness:Fintech + - internationalBusiness:HealthcareManagementAndConsulting + - internationalBusiness:Management + - internationalBusiness:ManagementInformationSystems + - internationalBusiness:Marketing + - internationalBusiness:MarketingAnalytics + - internationalBusiness:SocialInnovationAndEntrepreneurship + - internationalBusiness:SupplyChainManagement + - journalism + - landscapeArchitecture + - linguistics + - marineBiology + - mathematics + - mechanicalEngineering + - mediaAndScreenStudies + - mediaArts + - music + - musicTechnology + - nursing + - pharmaceuticalSciences + - pharmacy(PharmD) + - philosophy + - physics + - politicalScience + - politicsPhilosophyEconomics + - psychology + - publicHealth + - publicRelations + - religiousStudies + - sociology + - spanish + - speechLanguagePathologyAndAudiology + - theatre maxLength: 255 type: object models.User: properties: college: allOf: - - $ref: '#/definitions/models.College' + - $ref: "#/definitions/models.College" maxLength: 255 created_at: example: "2023-09-20T16:34:50Z" @@ -1599,10 +1599,10 @@ definitions: type: string graduation_cycle: allOf: - - $ref: '#/definitions/models.GraduationCycle' + - $ref: "#/definitions/models.GraduationCycle" enum: - - december - - may + - december + - may maxLength: 255 graduation_year: type: integer @@ -1616,336 +1616,336 @@ definitions: type: string major0: allOf: - - $ref: '#/definitions/models.Major' + - $ref: "#/definitions/models.Major" enum: - - africanaStudies - - americanSignLanguage - - americanSignLanguage-EnglishInterpreting - - appliedPhysics - - architecturalStudies - - architecture - - art:ArtVisualStudies - - behavioralNeuroscience - - biochemistry - - bioengineering - - biology - - biomedicalPhysics - - businessAdministration - - businessAdministration:Accounting - - businessAdministration:AccountingAndAdvisoryServices - - businessAdministration:BrandManagement - - businessAdministration:BusinessAnalytics - - businessAdministration:CorporateInnovation - - businessAdministration:EntrepreneurialStartups - - businessAdministration:FamilyBusiness - - businessAdministration:Finance - - businessAdministration:Fintech - - businessAdministration:HealthcareManagementAndConsulting - - businessAdministration:Management - - businessAdministration:ManagementInformationSystems - - businessAdministration:Marketing - - businessAdministration:MarketingAnalytics - - businessAdministration:SocialInnovationAndEntrepreneurship - - businessAdministration:SupplyChainManagement - - cellAndMolecularBiology - - chemicalEngineering - - chemistry - - civilEngineering - - communicationStudies - - computerEngineering - - computerScience - - computingAndLaw - - criminologyAndCriminalJustice - - culturalAnthropology - - cybersecurity - - dataScience - - design - - economics - - electricalEngineering - - english - - environmentalAndSustainabilityStudies - - environmentalEngineering - - environmentalScience - - environmentalStudies - - gameArtAndAnimation - - gameDesign - - globalAsianStudies - - healthScience - - history - - historyCultureAndLaw - - humanServices - - industrialEngineering - - internationalAffairs - - internationalBusiness - - internationalBusiness:Accounting - - internationalBusiness:AccountingAndAdvisoryServices - - internationalBusiness:BrandManagement - - internationalBusiness:BusinessAnalytics - - internationalBusiness:CorporateInnovation - - internationalBusiness:EntrepreneurialStartups - - internationalBusiness:FamilyBusiness - - internationalBusiness:Finance - - internationalBusiness:Fintech - - internationalBusiness:HealthcareManagementAndConsulting - - internationalBusiness:Management - - internationalBusiness:ManagementInformationSystems - - internationalBusiness:Marketing - - internationalBusiness:MarketingAnalytics - - internationalBusiness:SocialInnovationAndEntrepreneurship - - internationalBusiness:SupplyChainManagement - - journalism - - landscapeArchitecture - - linguistics - - marineBiology - - mathematics - - mechanicalEngineering - - mediaAndScreenStudies - - mediaArts - - music - - musicTechnology - - nursing - - pharmaceuticalSciences - - pharmacy(PharmD) - - philosophy - - physics - - politicalScience - - politicsPhilosophyEconomics - - psychology - - publicHealth - - publicRelations - - religiousStudies - - sociology - - spanish - - speechLanguagePathologyAndAudiology - - theatre + - africanaStudies + - americanSignLanguage + - americanSignLanguage-EnglishInterpreting + - appliedPhysics + - architecturalStudies + - architecture + - art:ArtVisualStudies + - behavioralNeuroscience + - biochemistry + - bioengineering + - biology + - biomedicalPhysics + - businessAdministration + - businessAdministration:Accounting + - businessAdministration:AccountingAndAdvisoryServices + - businessAdministration:BrandManagement + - businessAdministration:BusinessAnalytics + - businessAdministration:CorporateInnovation + - businessAdministration:EntrepreneurialStartups + - businessAdministration:FamilyBusiness + - businessAdministration:Finance + - businessAdministration:Fintech + - businessAdministration:HealthcareManagementAndConsulting + - businessAdministration:Management + - businessAdministration:ManagementInformationSystems + - businessAdministration:Marketing + - businessAdministration:MarketingAnalytics + - businessAdministration:SocialInnovationAndEntrepreneurship + - businessAdministration:SupplyChainManagement + - cellAndMolecularBiology + - chemicalEngineering + - chemistry + - civilEngineering + - communicationStudies + - computerEngineering + - computerScience + - computingAndLaw + - criminologyAndCriminalJustice + - culturalAnthropology + - cybersecurity + - dataScience + - design + - economics + - electricalEngineering + - english + - environmentalAndSustainabilityStudies + - environmentalEngineering + - environmentalScience + - environmentalStudies + - gameArtAndAnimation + - gameDesign + - globalAsianStudies + - healthScience + - history + - historyCultureAndLaw + - humanServices + - industrialEngineering + - internationalAffairs + - internationalBusiness + - internationalBusiness:Accounting + - internationalBusiness:AccountingAndAdvisoryServices + - internationalBusiness:BrandManagement + - internationalBusiness:BusinessAnalytics + - internationalBusiness:CorporateInnovation + - internationalBusiness:EntrepreneurialStartups + - internationalBusiness:FamilyBusiness + - internationalBusiness:Finance + - internationalBusiness:Fintech + - internationalBusiness:HealthcareManagementAndConsulting + - internationalBusiness:Management + - internationalBusiness:ManagementInformationSystems + - internationalBusiness:Marketing + - internationalBusiness:MarketingAnalytics + - internationalBusiness:SocialInnovationAndEntrepreneurship + - internationalBusiness:SupplyChainManagement + - journalism + - landscapeArchitecture + - linguistics + - marineBiology + - mathematics + - mechanicalEngineering + - mediaAndScreenStudies + - mediaArts + - music + - musicTechnology + - nursing + - pharmaceuticalSciences + - pharmacy(PharmD) + - philosophy + - physics + - politicalScience + - politicsPhilosophyEconomics + - psychology + - publicHealth + - publicRelations + - religiousStudies + - sociology + - spanish + - speechLanguagePathologyAndAudiology + - theatre maxLength: 255 major1: allOf: - - $ref: '#/definitions/models.Major' + - $ref: "#/definitions/models.Major" enum: - - africanaStudies - - americanSignLanguage - - americanSignLanguage-EnglishInterpreting - - appliedPhysics - - architecturalStudies - - architecture - - art:ArtVisualStudies - - behavioralNeuroscience - - biochemistry - - bioengineering - - biology - - biomedicalPhysics - - businessAdministration - - businessAdministration:Accounting - - businessAdministration:AccountingAndAdvisoryServices - - businessAdministration:BrandManagement - - businessAdministration:BusinessAnalytics - - businessAdministration:CorporateInnovation - - businessAdministration:EntrepreneurialStartups - - businessAdministration:FamilyBusiness - - businessAdministration:Finance - - businessAdministration:Fintech - - businessAdministration:HealthcareManagementAndConsulting - - businessAdministration:Management - - businessAdministration:ManagementInformationSystems - - businessAdministration:Marketing - - businessAdministration:MarketingAnalytics - - businessAdministration:SocialInnovationAndEntrepreneurship - - businessAdministration:SupplyChainManagement - - cellAndMolecularBiology - - chemicalEngineering - - chemistry - - civilEngineering - - communicationStudies - - computerEngineering - - computerScience - - computingAndLaw - - criminologyAndCriminalJustice - - culturalAnthropology - - cybersecurity - - dataScience - - design - - economics - - electricalEngineering - - english - - environmentalAndSustainabilityStudies - - environmentalEngineering - - environmentalScience - - environmentalStudies - - gameArtAndAnimation - - gameDesign - - globalAsianStudies - - healthScience - - history - - historyCultureAndLaw - - humanServices - - industrialEngineering - - internationalAffairs - - internationalBusiness - - internationalBusiness:Accounting - - internationalBusiness:AccountingAndAdvisoryServices - - internationalBusiness:BrandManagement - - internationalBusiness:BusinessAnalytics - - internationalBusiness:CorporateInnovation - - internationalBusiness:EntrepreneurialStartups - - internationalBusiness:FamilyBusiness - - internationalBusiness:Finance - - internationalBusiness:Fintech - - internationalBusiness:HealthcareManagementAndConsulting - - internationalBusiness:Management - - internationalBusiness:ManagementInformationSystems - - internationalBusiness:Marketing - - internationalBusiness:MarketingAnalytics - - internationalBusiness:SocialInnovationAndEntrepreneurship - - internationalBusiness:SupplyChainManagement - - journalism - - landscapeArchitecture - - linguistics - - marineBiology - - mathematics - - mechanicalEngineering - - mediaAndScreenStudies - - mediaArts - - music - - musicTechnology - - nursing - - pharmaceuticalSciences - - pharmacy(PharmD) - - philosophy - - physics - - politicalScience - - politicsPhilosophyEconomics - - psychology - - publicHealth - - publicRelations - - religiousStudies - - sociology - - spanish - - speechLanguagePathologyAndAudiology - - theatre + - africanaStudies + - americanSignLanguage + - americanSignLanguage-EnglishInterpreting + - appliedPhysics + - architecturalStudies + - architecture + - art:ArtVisualStudies + - behavioralNeuroscience + - biochemistry + - bioengineering + - biology + - biomedicalPhysics + - businessAdministration + - businessAdministration:Accounting + - businessAdministration:AccountingAndAdvisoryServices + - businessAdministration:BrandManagement + - businessAdministration:BusinessAnalytics + - businessAdministration:CorporateInnovation + - businessAdministration:EntrepreneurialStartups + - businessAdministration:FamilyBusiness + - businessAdministration:Finance + - businessAdministration:Fintech + - businessAdministration:HealthcareManagementAndConsulting + - businessAdministration:Management + - businessAdministration:ManagementInformationSystems + - businessAdministration:Marketing + - businessAdministration:MarketingAnalytics + - businessAdministration:SocialInnovationAndEntrepreneurship + - businessAdministration:SupplyChainManagement + - cellAndMolecularBiology + - chemicalEngineering + - chemistry + - civilEngineering + - communicationStudies + - computerEngineering + - computerScience + - computingAndLaw + - criminologyAndCriminalJustice + - culturalAnthropology + - cybersecurity + - dataScience + - design + - economics + - electricalEngineering + - english + - environmentalAndSustainabilityStudies + - environmentalEngineering + - environmentalScience + - environmentalStudies + - gameArtAndAnimation + - gameDesign + - globalAsianStudies + - healthScience + - history + - historyCultureAndLaw + - humanServices + - industrialEngineering + - internationalAffairs + - internationalBusiness + - internationalBusiness:Accounting + - internationalBusiness:AccountingAndAdvisoryServices + - internationalBusiness:BrandManagement + - internationalBusiness:BusinessAnalytics + - internationalBusiness:CorporateInnovation + - internationalBusiness:EntrepreneurialStartups + - internationalBusiness:FamilyBusiness + - internationalBusiness:Finance + - internationalBusiness:Fintech + - internationalBusiness:HealthcareManagementAndConsulting + - internationalBusiness:Management + - internationalBusiness:ManagementInformationSystems + - internationalBusiness:Marketing + - internationalBusiness:MarketingAnalytics + - internationalBusiness:SocialInnovationAndEntrepreneurship + - internationalBusiness:SupplyChainManagement + - journalism + - landscapeArchitecture + - linguistics + - marineBiology + - mathematics + - mechanicalEngineering + - mediaAndScreenStudies + - mediaArts + - music + - musicTechnology + - nursing + - pharmaceuticalSciences + - pharmacy(PharmD) + - philosophy + - physics + - politicalScience + - politicsPhilosophyEconomics + - psychology + - publicHealth + - publicRelations + - religiousStudies + - sociology + - spanish + - speechLanguagePathologyAndAudiology + - theatre maxLength: 255 major2: allOf: - - $ref: '#/definitions/models.Major' + - $ref: "#/definitions/models.Major" enum: - - africanaStudies - - americanSignLanguage - - americanSignLanguage-EnglishInterpreting - - appliedPhysics - - architecturalStudies - - architecture - - art:ArtVisualStudies - - behavioralNeuroscience - - biochemistry - - bioengineering - - biology - - biomedicalPhysics - - businessAdministration - - businessAdministration:Accounting - - businessAdministration:AccountingAndAdvisoryServices - - businessAdministration:BrandManagement - - businessAdministration:BusinessAnalytics - - businessAdministration:CorporateInnovation - - businessAdministration:EntrepreneurialStartups - - businessAdministration:FamilyBusiness - - businessAdministration:Finance - - businessAdministration:Fintech - - businessAdministration:HealthcareManagementAndConsulting - - businessAdministration:Management - - businessAdministration:ManagementInformationSystems - - businessAdministration:Marketing - - businessAdministration:MarketingAnalytics - - businessAdministration:SocialInnovationAndEntrepreneurship - - businessAdministration:SupplyChainManagement - - cellAndMolecularBiology - - chemicalEngineering - - chemistry - - civilEngineering - - communicationStudies - - computerEngineering - - computerScience - - computingAndLaw - - criminologyAndCriminalJustice - - culturalAnthropology - - cybersecurity - - dataScience - - design - - economics - - electricalEngineering - - english - - environmentalAndSustainabilityStudies - - environmentalEngineering - - environmentalScience - - environmentalStudies - - gameArtAndAnimation - - gameDesign - - globalAsianStudies - - healthScience - - history - - historyCultureAndLaw - - humanServices - - industrialEngineering - - internationalAffairs - - internationalBusiness - - internationalBusiness:Accounting - - internationalBusiness:AccountingAndAdvisoryServices - - internationalBusiness:BrandManagement - - internationalBusiness:BusinessAnalytics - - internationalBusiness:CorporateInnovation - - internationalBusiness:EntrepreneurialStartups - - internationalBusiness:FamilyBusiness - - internationalBusiness:Finance - - internationalBusiness:Fintech - - internationalBusiness:HealthcareManagementAndConsulting - - internationalBusiness:Management - - internationalBusiness:ManagementInformationSystems - - internationalBusiness:Marketing - - internationalBusiness:MarketingAnalytics - - internationalBusiness:SocialInnovationAndEntrepreneurship - - internationalBusiness:SupplyChainManagement - - journalism - - landscapeArchitecture - - linguistics - - marineBiology - - mathematics - - mechanicalEngineering - - mediaAndScreenStudies - - mediaArts - - music - - musicTechnology - - nursing - - pharmaceuticalSciences - - pharmacy(PharmD) - - philosophy - - physics - - politicalScience - - politicsPhilosophyEconomics - - psychology - - publicHealth - - publicRelations - - religiousStudies - - sociology - - spanish - - speechLanguagePathologyAndAudiology - - theatre + - africanaStudies + - americanSignLanguage + - americanSignLanguage-EnglishInterpreting + - appliedPhysics + - architecturalStudies + - architecture + - art:ArtVisualStudies + - behavioralNeuroscience + - biochemistry + - bioengineering + - biology + - biomedicalPhysics + - businessAdministration + - businessAdministration:Accounting + - businessAdministration:AccountingAndAdvisoryServices + - businessAdministration:BrandManagement + - businessAdministration:BusinessAnalytics + - businessAdministration:CorporateInnovation + - businessAdministration:EntrepreneurialStartups + - businessAdministration:FamilyBusiness + - businessAdministration:Finance + - businessAdministration:Fintech + - businessAdministration:HealthcareManagementAndConsulting + - businessAdministration:Management + - businessAdministration:ManagementInformationSystems + - businessAdministration:Marketing + - businessAdministration:MarketingAnalytics + - businessAdministration:SocialInnovationAndEntrepreneurship + - businessAdministration:SupplyChainManagement + - cellAndMolecularBiology + - chemicalEngineering + - chemistry + - civilEngineering + - communicationStudies + - computerEngineering + - computerScience + - computingAndLaw + - criminologyAndCriminalJustice + - culturalAnthropology + - cybersecurity + - dataScience + - design + - economics + - electricalEngineering + - english + - environmentalAndSustainabilityStudies + - environmentalEngineering + - environmentalScience + - environmentalStudies + - gameArtAndAnimation + - gameDesign + - globalAsianStudies + - healthScience + - history + - historyCultureAndLaw + - humanServices + - industrialEngineering + - internationalAffairs + - internationalBusiness + - internationalBusiness:Accounting + - internationalBusiness:AccountingAndAdvisoryServices + - internationalBusiness:BrandManagement + - internationalBusiness:BusinessAnalytics + - internationalBusiness:CorporateInnovation + - internationalBusiness:EntrepreneurialStartups + - internationalBusiness:FamilyBusiness + - internationalBusiness:Finance + - internationalBusiness:Fintech + - internationalBusiness:HealthcareManagementAndConsulting + - internationalBusiness:Management + - internationalBusiness:ManagementInformationSystems + - internationalBusiness:Marketing + - internationalBusiness:MarketingAnalytics + - internationalBusiness:SocialInnovationAndEntrepreneurship + - internationalBusiness:SupplyChainManagement + - journalism + - landscapeArchitecture + - linguistics + - marineBiology + - mathematics + - mechanicalEngineering + - mediaAndScreenStudies + - mediaArts + - music + - musicTechnology + - nursing + - pharmaceuticalSciences + - pharmacy(PharmD) + - philosophy + - physics + - politicalScience + - politicsPhilosophyEconomics + - psychology + - publicHealth + - publicRelations + - religiousStudies + - sociology + - spanish + - speechLanguagePathologyAndAudiology + - theatre maxLength: 255 role: enum: - - super - - student + - super + - student type: string updated_at: example: "2023-09-20T16:34:50Z" type: string required: - - college - - email - - first_name - - graduation_cycle - - graduation_year - - last_name - - major0 - - role + - college + - email + - first_name + - graduation_cycle + - graduation_year + - last_name + - major0 + - role type: object models.VerifyEmailRequestBody: properties: @@ -1954,8 +1954,8 @@ definitions: token: type: string required: - - email - - token + - email + - token type: object models.VerifyPasswordResetTokenRequestBody: properties: @@ -1968,9 +1968,9 @@ definitions: minLength: 8 type: string required: - - new_password - - token - - verify_new_password + - new_password + - token + - verify_new_password type: object tag.CreateUserTagsBody: properties: @@ -1979,7 +1979,7 @@ definitions: type: string type: array required: - - tags + - tags type: object utilities.SuccessResponse: properties: @@ -1992,23 +1992,23 @@ paths: /auth/forgot-password: post: consumes: - - application/json + - application/json description: Generates a password reset token operationId: forgot-password parameters: - - description: Email - in: body - name: email - required: true - schema: - type: string + - description: Email + in: body + name: email + required: true + schema: + type: string produces: - - application/json + - application/json responses: "200": description: OK schema: - $ref: '#/definitions/utilities.SuccessResponse' + $ref: "#/definitions/utilities.SuccessResponse" "400": description: Bad Request schema: {} @@ -2020,27 +2020,27 @@ paths: schema: {} summary: Generates a password reset token tags: - - auth + - auth /auth/login: post: consumes: - - application/json + - application/json description: Logs in a user operationId: login-user parameters: - - description: Login Body - in: body - name: loginBody - required: true - schema: - $ref: '#/definitions/models.LoginUserResponseBody' + - description: Login Body + in: body + name: loginBody + required: true + schema: + $ref: "#/definitions/models.LoginResponseBody" produces: - - application/json + - application/json responses: "200": description: OK schema: - $ref: '#/definitions/models.User' + $ref: "#/definitions/models.User" "400": description: Bad Request schema: {} @@ -2052,36 +2052,36 @@ paths: schema: {} summary: Logs in a user tags: - - auth + - auth /auth/logout: post: consumes: - - application/json + - application/json description: Logs out a user operationId: logout-user produces: - - application/json + - application/json responses: "200": description: OK schema: - $ref: '#/definitions/utilities.SuccessResponse' + $ref: "#/definitions/utilities.SuccessResponse" summary: Logs out a user tags: - - auth + - auth /auth/me: get: consumes: - - application/json + - application/json description: Retrieves the currently authenticated user operationId: get-me produces: - - application/json + - application/json responses: "200": description: OK schema: - $ref: '#/definitions/models.User' + $ref: "#/definitions/models.User" "400": description: Bad Request schema: {} @@ -2095,23 +2095,23 @@ paths: description: Internal Server Error schema: {} security: - - Bearer: [] + - Bearer: [] summary: Retrieves the currently authenticated user tags: - - auth + - auth /auth/refresh: post: consumes: - - application/json + - application/json description: Refreshes a user's access token operationId: refresh-user produces: - - application/json + - application/json responses: "200": description: OK schema: - $ref: '#/definitions/utilities.SuccessResponse' + $ref: "#/definitions/utilities.SuccessResponse" "400": description: Bad Request schema: {} @@ -2123,27 +2123,27 @@ paths: schema: {} summary: Refreshes a user's access token tags: - - auth + - auth /auth/send-code: post: consumes: - - application/json + - application/json description: Sends a verification code operationId: send-verification-code parameters: - - description: Email - in: body - name: email - required: true - schema: - type: string + - description: Email + in: body + name: email + required: true + schema: + type: string produces: - - application/json + - application/json responses: "200": description: OK schema: - $ref: '#/definitions/utilities.SuccessResponse' + $ref: "#/definitions/utilities.SuccessResponse" "400": description: Bad Request schema: {} @@ -2155,27 +2155,27 @@ paths: schema: {} summary: Sends a verification code tags: - - auth + - auth /auth/verify-email: post: consumes: - - application/json + - application/json description: Verifies an email operationId: verify-email parameters: - - description: Email Verification Token Body - in: body - name: tokenBody - required: true - schema: - $ref: '#/definitions/models.VerifyEmailRequestBody' + - description: Email Verification Token Body + in: body + name: tokenBody + required: true + schema: + $ref: "#/definitions/models.VerifyEmailRequestBody" produces: - - application/json + - application/json responses: "200": description: OK schema: - $ref: '#/definitions/utilities.SuccessResponse' + $ref: "#/definitions/utilities.SuccessResponse" "400": description: Bad Request schema: {} @@ -2187,27 +2187,27 @@ paths: schema: {} summary: Verifies an email tags: - - auth + - auth /auth/verify-reset: post: consumes: - - application/json + - application/json description: Verifies a password reset token operationId: verify-password-reset-token parameters: - - description: Password Reset Token Body - in: body - name: tokenBody - required: true - schema: - $ref: '#/definitions/models.VerifyPasswordResetTokenRequestBody' + - description: Password Reset Token Body + in: body + name: tokenBody + required: true + schema: + $ref: "#/definitions/models.VerifyPasswordResetTokenRequestBody" produces: - - application/json + - application/json responses: "200": description: OK schema: - $ref: '#/definitions/utilities.SuccessResponse' + $ref: "#/definitions/utilities.SuccessResponse" "400": description: Bad Request schema: {} @@ -2218,31 +2218,31 @@ paths: description: Internal Server Error schema: {} security: - - Bearer: [] + - Bearer: [] summary: Verifies a password reset token tags: - - auth + - auth /categories/: get: description: Retrieves all categories operationId: get-categories parameters: - - description: Limit - in: query - name: limit - type: integer - - description: Page - in: query - name: page - type: integer + - description: Limit + in: query + name: limit + type: integer + - description: Page + in: query + name: page + type: integer produces: - - application/json + - application/json responses: "200": description: OK schema: items: - $ref: '#/definitions/models.Category' + $ref: "#/definitions/models.Category" type: array "400": description: Bad Request @@ -2258,26 +2258,26 @@ paths: type: string summary: Retrieve all categories tags: - - category + - category post: consumes: - - application/json + - application/json description: Creates a category operationId: create-category parameters: - - description: Category Body - in: body - name: categoryBody - required: true - schema: - $ref: '#/definitions/models.CategoryRequestBody' + - description: Category Body + in: body + name: categoryBody + required: true + schema: + $ref: "#/definitions/categories.CategoryRequestBody" produces: - - application/json + - application/json responses: "201": description: Created schema: - $ref: '#/definitions/models.Category' + $ref: "#/definitions/models.Category" "400": description: Bad Request schema: @@ -2300,19 +2300,19 @@ paths: type: string summary: Creates a category tags: - - category + - category /categories/{categoryID}/: delete: description: Deletes a category operationId: delete-category parameters: - - description: Category ID - in: path - name: categoryID - required: true - type: string + - description: Category ID + in: path + name: categoryID + required: true + type: string produces: - - application/json + - application/json responses: "204": description: No Content @@ -2336,23 +2336,23 @@ paths: type: string summary: Deletes a category tags: - - category + - category get: description: Retrieves a category operationId: get-category parameters: - - description: Category ID - in: path - name: categoryID - required: true - type: string + - description: Category ID + in: path + name: categoryID + required: true + type: string produces: - - application/json + - application/json responses: "200": description: OK schema: - $ref: '#/definitions/models.Category' + $ref: "#/definitions/models.Category" "400": description: Bad Request schema: @@ -2367,31 +2367,31 @@ paths: type: string summary: Retrieve a category tags: - - category + - category patch: consumes: - - application/json + - application/json description: Updates a category operationId: update-category parameters: - - description: Category ID - in: path - name: categoryID - required: true - type: string - - description: Category Body - in: body - name: categoryBody - required: true - schema: - $ref: '#/definitions/models.CategoryRequestBody' + - description: Category ID + in: path + name: categoryID + required: true + type: string + - description: Category Body + in: body + name: categoryBody + required: true + schema: + $ref: "#/definitions/categories.CategoryRequestBody" produces: - - application/json + - application/json responses: "200": description: OK schema: - $ref: '#/definitions/models.Category' + $ref: "#/definitions/models.Category" "400": description: Bad Request schema: @@ -2410,33 +2410,33 @@ paths: type: string summary: Updates a category tags: - - category + - category /categories/{categoryID}/tags/: get: description: Retrieves all tags associated with a category operationId: get-tags-by-category parameters: - - description: Category ID - in: path - name: categoryID - required: true - type: string - - description: Limit - in: query - name: limit - type: integer - - description: Page - in: query - name: page - type: integer + - description: Category ID + in: path + name: categoryID + required: true + type: string + - description: Limit + in: query + name: limit + type: integer + - description: Page + in: query + name: page + type: integer produces: - - application/json + - application/json responses: "200": description: OK schema: items: - $ref: '#/definitions/models.Tag' + $ref: "#/definitions/models.Tag" type: array "400": description: Bad Request @@ -2449,29 +2449,29 @@ paths: schema: {} summary: Retrieve all tags by category tags: - - category-tag + - category-tag /categories/{categoryID}/tags/{tagID}/: get: description: Retrieves a tag associated with a category operationId: get-tag-by-category parameters: - - description: Category ID - in: path - name: categoryID - required: true - type: string - - description: Tag ID - in: path - name: tagID - required: true - type: string + - description: Category ID + in: path + name: categoryID + required: true + type: string + - description: Tag ID + in: path + name: tagID + required: true + type: string produces: - - application/json + - application/json responses: "200": description: OK schema: - $ref: '#/definitions/models.Tag' + $ref: "#/definitions/models.Tag" "400": description: Bad Request schema: {} @@ -2483,28 +2483,28 @@ paths: schema: {} summary: Retrieve a tag by category tags: - - category-tag + - category-tag /clubs/: get: description: Retrieves all clubs operationId: get-all-clubs parameters: - - description: Limit - in: query - name: limit - type: integer - - description: Page - in: query - name: page - type: integer + - description: Limit + in: query + name: limit + type: integer + - description: Page + in: query + name: page + type: integer produces: - - application/json + - application/json responses: "200": description: OK schema: items: - $ref: '#/definitions/models.Club' + $ref: "#/definitions/models.Club" type: array "400": description: Bad Request @@ -2514,26 +2514,26 @@ paths: schema: {} summary: Retrieve all clubs tags: - - club + - club post: consumes: - - application/json + - application/json description: Creates a club operationId: create-club parameters: - - description: Club - in: body - name: club - required: true - schema: - $ref: '#/definitions/models.CreateClubRequestBody' + - description: Club + in: body + name: club + required: true + schema: + $ref: "#/definitions/CreateClubRequestBody" produces: - - application/json + - application/json responses: "201": description: Created schema: - $ref: '#/definitions/models.Club' + $ref: "#/definitions/models.Club" "400": description: Bad Request schema: {} @@ -2548,19 +2548,19 @@ paths: schema: {} summary: Create a club tags: - - club + - club /clubs/{clubID}/: delete: description: Deletes a club operationId: delete-club parameters: - - description: Club ID - in: path - name: clubID - required: true - type: string + - description: Club ID + in: path + name: clubID + required: true + type: string produces: - - application/json + - application/json responses: "204": description: No Content @@ -2580,23 +2580,23 @@ paths: schema: {} summary: Delete a club tags: - - club + - club get: description: Retrieves a club operationId: get-club parameters: - - description: Club ID - in: path - name: clubID - required: true - type: string + - description: Club ID + in: path + name: clubID + required: true + type: string produces: - - application/json + - application/json responses: "200": description: OK schema: - $ref: '#/definitions/models.Club' + $ref: "#/definitions/models.Club" "400": description: Bad Request schema: {} @@ -2608,31 +2608,31 @@ paths: schema: {} summary: Retrieve a club tags: - - club + - club patch: consumes: - - application/json + - application/json description: Updates a club operationId: update-club parameters: - - description: Club ID - in: path - name: clubID - required: true - type: string - - description: Club - in: body - name: club - required: true - schema: - $ref: '#/definitions/models.UpdateClubRequestBody' + - description: Club ID + in: path + name: clubID + required: true + type: string + - description: Club + in: body + name: club + required: true + schema: + $ref: "#/definitions/UpdateClubRequestBody" produces: - - application/json + - application/json responses: "200": description: OK schema: - $ref: '#/definitions/models.Club' + $ref: "#/definitions/models.Club" "400": description: Bad Request schema: {} @@ -2647,25 +2647,25 @@ paths: schema: {} summary: Update a club tags: - - club + - club /clubs/{clubID}/contacts/: get: description: Retrieves all contacts associated with a club operationId: get-contacts-by-club parameters: - - description: Club ID - in: path - name: clubID - required: true - type: string + - description: Club ID + in: path + name: clubID + required: true + type: string produces: - - application/json + - application/json responses: "200": description: OK schema: items: - $ref: '#/definitions/models.Contact' + $ref: "#/definitions/models.Contact" type: array "400": description: Bad Request @@ -2678,31 +2678,31 @@ paths: schema: {} summary: Retrieve all contacts for a club tags: - - club-contact + - club-contact put: consumes: - - application/json + - application/json description: Creates a contact operationId: put-contact parameters: - - description: Club ID - in: path - name: clubID - required: true - type: string - - description: Contact Body - in: body - name: contactBody - required: true - schema: - $ref: '#/definitions/models.PutContactRequestBody' + - description: Club ID + in: path + name: clubID + required: true + type: string + - description: Contact Body + in: body + name: contactBody + required: true + schema: + $ref: "#/definitions/PutContactRequestBody" produces: - - application/json + - application/json responses: "201": description: Created schema: - $ref: '#/definitions/models.Contact' + $ref: "#/definitions/models.Contact" "400": description: Bad Request schema: {} @@ -2717,33 +2717,33 @@ paths: schema: {} summary: Creates a contact tags: - - club-contact + - club-contact /clubs/{clubID}/events/: get: description: Retrieves all events associated with a club operationId: get-events-by-club parameters: - - description: Club ID - in: path - name: clubID - required: true - type: string - - description: Limit - in: query - name: limit - type: integer - - description: Page - in: query - name: page - type: integer + - description: Club ID + in: path + name: clubID + required: true + type: string + - description: Limit + in: query + name: limit + type: integer + - description: Page + in: query + name: page + type: integer produces: - - application/json + - application/json responses: "200": description: OK schema: items: - $ref: '#/definitions/models.Event' + $ref: "#/definitions/models.Event" type: array "400": description: Bad Request @@ -2756,33 +2756,33 @@ paths: schema: {} summary: Retrieve all events for a club tags: - - club-event + - club-event /clubs/{clubID}/followers/: get: description: Retrieves all followers associated with a club operationId: get-followers-by-club parameters: - - description: Club ID - in: path - name: clubID - required: true - type: string - - description: Limit - in: query - name: limit - type: integer - - description: Page - in: query - name: page - type: integer + - description: Club ID + in: path + name: clubID + required: true + type: string + - description: Limit + in: query + name: limit + type: integer + - description: Page + in: query + name: page + type: integer produces: - - application/json + - application/json responses: "200": description: OK schema: items: - $ref: '#/definitions/models.User' + $ref: "#/definitions/models.User" type: array "400": description: Bad Request @@ -2795,29 +2795,29 @@ paths: schema: {} summary: Retrieve all followers for a club tags: - - club-follower + - club-follower /clubs/{clubID}/members/: delete: description: Deletes a member associated with a club operationId: delete-member-from-club parameters: - - description: Club ID - in: path - name: clubID - required: true - type: string - - description: User ID - in: path - name: userID - required: true - type: string + - description: Club ID + in: path + name: clubID + required: true + type: string + - description: User ID + in: path + name: userID + required: true + type: string produces: - - application/json + - application/json responses: "204": description: No Content schema: - $ref: '#/definitions/models.User' + $ref: "#/definitions/models.User" "400": description: Bad Request schema: {} @@ -2832,32 +2832,32 @@ paths: schema: {} summary: Delete a member from a club tags: - - club-member + - club-member get: description: Retrieves all members associated with a club operationId: get-members-by-club parameters: - - description: Club ID - in: path - name: clubID - required: true - type: string - - description: Limit - in: query - name: limit - type: integer - - description: Page - in: query - name: page - type: integer + - description: Club ID + in: path + name: clubID + required: true + type: string + - description: Limit + in: query + name: limit + type: integer + - description: Page + in: query + name: page + type: integer produces: - - application/json + - application/json responses: "200": description: OK schema: items: - $ref: '#/definitions/models.User' + $ref: "#/definitions/models.User" type: array "400": description: Bad Request @@ -2873,30 +2873,30 @@ paths: schema: {} summary: Retrieve all members for a club tags: - - club-member + - club-member post: consumes: - - application/json + - application/json description: Creates a new member associated with a club operationId: create-member-for-club parameters: - - description: Club ID - in: path - name: clubID - required: true - type: string - - description: User ID - in: path - name: userID - required: true - type: string + - description: Club ID + in: path + name: clubID + required: true + type: string + - description: User ID + in: path + name: userID + required: true + type: string produces: - - application/json + - application/json responses: "201": description: Created schema: - $ref: '#/definitions/models.User' + $ref: "#/definitions/models.User" "400": description: Bad Request schema: {} @@ -2911,26 +2911,26 @@ paths: schema: {} summary: Create a new member for a club tags: - - club-member + - club-member /clubs/{clubID}/poc/: post: consumes: - - multipart/form-data + - multipart/form-data description: Creates a point of contact associated with a club operationId: create-point-of-contact-by-club parameters: - - description: Club ID - in: path - name: clubID - required: true - type: string + - description: Club ID + in: path + name: clubID + required: true + type: string produces: - - application/json + - application/json responses: "201": description: Created schema: - $ref: '#/definitions/models.PointOfContact' + $ref: "#/definitions/models.PointOfContact" "400": description: Bad Request schema: {} @@ -2945,24 +2945,24 @@ paths: schema: {} summary: Create a point of contact for a club tags: - - club-point-of-contact + - club-point-of-contact /clubs/{clubID}/poc/{pocID}: delete: description: Delete a point of contact associated with a club operationId: delete-point-of-contact-by-club parameters: - - description: Club ID - in: path - name: clubID - required: true - type: string - - description: Point of Contact ID - in: path - name: pocID - required: true - type: string + - description: Club ID + in: path + name: clubID + required: true + type: string + - description: Point of Contact ID + in: path + name: pocID + required: true + type: string produces: - - application/json + - application/json responses: "204": description: No Content @@ -2977,30 +2977,30 @@ paths: schema: {} summary: Delete a point of contact for a club tags: - - club-point-of-contact + - club-point-of-contact patch: consumes: - - multipart/form-data + - multipart/form-data description: Updates a point of contact photo associated with a club operationId: update-point-of-contact-photo-by-club parameters: - - description: Club ID - in: path - name: clubID - required: true - type: string - - description: Point of Contact ID - in: path - name: pocID - required: true - type: string + - description: Club ID + in: path + name: clubID + required: true + type: string + - description: Point of Contact ID + in: path + name: pocID + required: true + type: string produces: - - application/json + - application/json responses: "200": description: OK schema: - $ref: '#/definitions/models.PointOfContact' + $ref: "#/definitions/models.PointOfContact" "400": description: Bad Request schema: {} @@ -3015,30 +3015,30 @@ paths: schema: {} summary: Update a point of contact photo for a club tags: - - club-point-of-contact + - club-point-of-contact put: consumes: - - application/json + - application/json description: Updates a point of contact associated with a club operationId: update-point-of-contact-by-club parameters: - - description: Club ID - in: path - name: clubID - required: true - type: string - - description: Point of Contact ID - in: path - name: pocID - required: true - type: string + - description: Club ID + in: path + name: clubID + required: true + type: string + - description: Point of Contact ID + in: path + name: pocID + required: true + type: string produces: - - application/json + - application/json responses: "200": description: OK schema: - $ref: '#/definitions/models.PointOfContact' + $ref: "#/definitions/models.PointOfContact" "400": description: Bad Request schema: {} @@ -3053,25 +3053,25 @@ paths: schema: {} summary: Update a point of contact for a club tags: - - club-point-of-contact + - club-point-of-contact /clubs/{clubID}/pocs/: get: description: Retrieves all point of contacts associated with a club operationId: get-point-of-contacts-by-club parameters: - - description: Club ID - in: path - name: clubID - required: true - type: string + - description: Club ID + in: path + name: clubID + required: true + type: string produces: - - application/json + - application/json responses: "200": description: OK schema: items: - $ref: '#/definitions/models.PointOfContact' + $ref: "#/definitions/models.PointOfContact" type: array "400": description: Bad Request @@ -3084,29 +3084,29 @@ paths: schema: {} summary: Retrieve all point of contacts for a club tags: - - club-point-of-contact + - club-point-of-contact /clubs/{clubID}/pocs/{pocID}: get: description: Retrieves a point of contact associated with a club operationId: get-point-of-contact-by-club parameters: - - description: Club ID - in: path - name: clubID - required: true - type: string - - description: Point of Contact ID - in: path - name: pocID - required: true - type: string + - description: Club ID + in: path + name: clubID + required: true + type: string + - description: Point of Contact ID + in: path + name: pocID + required: true + type: string produces: - - application/json + - application/json responses: "200": description: OK schema: - $ref: '#/definitions/models.PointOfContact' + $ref: "#/definitions/models.PointOfContact" "400": description: Bad Request schema: {} @@ -3118,25 +3118,25 @@ paths: schema: {} summary: Retrieve a point of contact for a club tags: - - club-point-of-contact + - club-point-of-contact /clubs/{clubID}/tags/: get: description: Retrieves all tags associated with a club operationId: get-tags-by-club parameters: - - description: Club ID - in: path - name: clubID - required: true - type: string + - description: Club ID + in: path + name: clubID + required: true + type: string produces: - - application/json + - application/json responses: "200": description: OK schema: items: - $ref: '#/definitions/models.Tag' + $ref: "#/definitions/models.Tag" type: array "400": description: Bad Request @@ -3149,32 +3149,32 @@ paths: schema: {} summary: Retrieve all tags for a club tags: - - club-tag + - club-tag post: consumes: - - application/json + - application/json description: Creates tags for a club operationId: create-club-tags parameters: - - description: Club ID - in: path - name: clubID - required: true - type: string - - description: Club Tags Body - in: body - name: clubTagsBody - required: true - schema: - $ref: '#/definitions/models.CreateClubTagsRequestBody' + - description: Club ID + in: path + name: clubID + required: true + type: string + - description: Club Tags Body + in: body + name: clubTagsBody + required: true + schema: + $ref: "#/definitions/CreateClubTagsRequestBody" produces: - - application/json + - application/json responses: "201": description: Created schema: items: - $ref: '#/definitions/models.Tag' + $ref: "#/definitions/models.Tag" type: array "400": description: Bad Request @@ -3190,24 +3190,24 @@ paths: schema: {} summary: Create club tags tags: - - club-tag + - club-tag /clubs/{clubID}/tags/{tagID}/: delete: description: Deletes a tag associated with a club operationId: delete-tag-by-club parameters: - - description: Club ID - in: path - name: clubID - required: true - type: string - - description: Tag ID - in: path - name: tagID - required: true - type: string + - description: Club ID + in: path + name: clubID + required: true + type: string + - description: Tag ID + in: path + name: tagID + required: true + type: string produces: - - application/json + - application/json responses: "204": description: No Content @@ -3227,28 +3227,28 @@ paths: schema: {} summary: Delete a tag for a club tags: - - club-tag + - club-tag /contacts/: get: description: Retrieves all contacts operationId: get-contacts parameters: - - description: Limit - in: query - name: limit - type: integer - - description: Page - in: query - name: page - type: integer + - description: Limit + in: query + name: limit + type: integer + - description: Page + in: query + name: page + type: integer produces: - - application/json + - application/json responses: "200": description: OK schema: items: - $ref: '#/definitions/models.Contact' + $ref: "#/definitions/models.Contact" type: array "400": description: Bad Request @@ -3264,26 +3264,26 @@ paths: type: string summary: Retrieve all contacts tags: - - contact + - contact /contacts/{contactID}/: delete: consumes: - - application/json + - application/json description: Deletes a contact operationId: delete-contact parameters: - - description: Contact ID - in: path - name: contactID - required: true - type: string + - description: Contact ID + in: path + name: contactID + required: true + type: string produces: - - application/json + - application/json responses: "201": description: Created schema: - $ref: '#/definitions/models.Contact' + $ref: "#/definitions/models.Contact" "400": description: Bad Request schema: @@ -3298,25 +3298,25 @@ paths: type: string summary: Deletes a contact tags: - - contact + - contact get: consumes: - - application/json + - application/json description: Retrieves a contact by id operationId: get-contact parameters: - - description: Contact ID - in: path - name: contactID - required: true - type: string + - description: Contact ID + in: path + name: contactID + required: true + type: string produces: - - application/json + - application/json responses: "201": description: Created schema: - $ref: '#/definitions/models.Contact' + $ref: "#/definitions/models.Contact" "400": description: Bad Request schema: @@ -3331,28 +3331,28 @@ paths: type: string summary: Retrieves a contact tags: - - contact + - contact /events/: get: description: Retrieves all events operationId: get-all-events parameters: - - description: Limit - in: query - name: limit - type: integer - - description: Page - in: query - name: page - type: integer + - description: Limit + in: query + name: limit + type: integer + - description: Page + in: query + name: page + type: integer produces: - - application/json + - application/json responses: "200": description: OK schema: items: - $ref: '#/definitions/models.Event' + $ref: "#/definitions/models.Event" type: array "400": description: Bad Request @@ -3365,26 +3365,26 @@ paths: schema: {} summary: Retrieve all events tags: - - event + - event post: consumes: - - application/json + - application/json description: Creates an event operationId: create-event parameters: - - description: Event Body - in: body - name: event - required: true - schema: - $ref: '#/definitions/models.CreateEventRequestBody' + - description: Event Body + in: body + name: event + required: true + schema: + $ref: "#/definitions/events.CreateEventRequestBody" produces: - - application/json + - application/json responses: "201": description: Created schema: - $ref: '#/definitions/models.Event' + $ref: "#/definitions/models.Event" "400": description: Bad Request schema: {} @@ -3399,19 +3399,19 @@ paths: schema: {} summary: Create an event tags: - - event + - event /events/{eventID}/: delete: description: Deletes an event operationId: delete-event parameters: - - description: Event ID - in: path - name: eventID - required: true - type: string + - description: Event ID + in: path + name: eventID + required: true + type: string produces: - - application/json + - application/json responses: "204": description: No Content @@ -3431,23 +3431,23 @@ paths: schema: {} summary: Delete an event tags: - - event + - event get: description: Retrieves an event operationId: get-event parameters: - - description: Event ID - in: path - name: eventID - required: true - type: string + - description: Event ID + in: path + name: eventID + required: true + type: string produces: - - application/json + - application/json responses: "200": description: OK schema: - $ref: '#/definitions/models.Event' + $ref: "#/definitions/models.Event" "400": description: Bad Request schema: {} @@ -3459,25 +3459,25 @@ paths: schema: {} summary: Retrieve an event tags: - - event + - event /events/{eventID}/hosts: get: description: Retrieves all hosts associated with an event operationId: get-hosts-by-event parameters: - - description: Event ID - in: path - name: eventID - required: true - type: string + - description: Event ID + in: path + name: eventID + required: true + type: string produces: - - application/json + - application/json responses: "200": description: OK schema: items: - $ref: '#/definitions/models.Club' + $ref: "#/definitions/models.Club" type: array "400": description: Bad Request @@ -3490,19 +3490,19 @@ paths: schema: {} summary: Retrieve all hosts by event tags: - - event + - event /events/{eventID}/series/: delete: description: Deletes all series associated with an event operationId: delete-series-by-event parameters: - - description: Event ID - in: path - name: eventID - required: true - type: string + - description: Event ID + in: path + name: eventID + required: true + type: string produces: - - application/json + - application/json responses: "204": description: No Content @@ -3522,24 +3522,24 @@ paths: schema: {} summary: Delete all series by event tags: - - event + - event get: description: Retrieves all series associated with an event operationId: get-series-by-event parameters: - - description: Event ID - in: path - name: eventID - required: true - type: string + - description: Event ID + in: path + name: eventID + required: true + type: string produces: - - application/json + - application/json responses: "200": description: OK schema: items: - $ref: '#/definitions/models.Series' + $ref: "#/definitions/models.Series" type: array "400": description: Bad Request @@ -3552,31 +3552,31 @@ paths: schema: {} summary: Retrieve all series by event tags: - - event + - event patch: consumes: - - application/json + - application/json description: Creates a series operationId: create-series parameters: - - description: Event ID - in: path - name: eventID - required: true - type: string - - description: Series Body - in: body - name: seriesBody - required: true - schema: - $ref: '#/definitions/models.UpdateEventRequestBody' + - description: Event ID + in: path + name: eventID + required: true + type: string + - description: Series Body + in: body + name: seriesBody + required: true + schema: + $ref: "#/definitions/events.UpdateEventRequestBody" produces: - - application/json + - application/json responses: "201": description: Created schema: - $ref: '#/definitions/models.Series' + $ref: "#/definitions/models.Series" "400": description: Bad Request schema: {} @@ -3591,24 +3591,24 @@ paths: schema: {} summary: Create a series tags: - - event + - event /events/{eventID}/series/{seriesID}/: delete: description: Deletes a series by ID operationId: delete-series-by-id parameters: - - description: Event ID - in: path - name: eventID - required: true - type: string - - description: Series ID - in: path - name: seriesID - required: true - type: string + - description: Event ID + in: path + name: eventID + required: true + type: string + - description: Series ID + in: path + name: seriesID + required: true + type: string produces: - - application/json + - application/json responses: "204": description: No Content @@ -3628,28 +3628,28 @@ paths: schema: {} summary: Delete a series by ID tags: - - event + - event get: description: Retrieves a series by ID operationId: get-series-by-id parameters: - - description: Event ID - in: path - name: eventID - required: true - type: string - - description: Series ID - in: path - name: seriesID - required: true - type: string + - description: Event ID + in: path + name: eventID + required: true + type: string + - description: Series ID + in: path + name: seriesID + required: true + type: string produces: - - application/json + - application/json responses: "200": description: OK schema: - $ref: '#/definitions/models.Series' + $ref: "#/definitions/models.Series" "400": description: Bad Request schema: {} @@ -3661,31 +3661,31 @@ paths: schema: {} summary: Retrieve a series by ID tags: - - event + - event patch: consumes: - - application/json + - application/json description: Updates a series by event ID operationId: update-series-by-event-id parameters: - - description: Event ID - in: path - name: eventID - required: true - type: string - - description: Series Body - in: body - name: seriesBody - required: true - schema: - $ref: '#/definitions/models.UpdateSeriesRequestBody' + - description: Event ID + in: path + name: eventID + required: true + type: string + - description: Series Body + in: body + name: seriesBody + required: true + schema: + $ref: "#/definitions/models.UpdateSeriesRequestBody" produces: - - application/json + - application/json responses: "200": description: OK schema: - $ref: '#/definitions/models.Series' + $ref: "#/definitions/models.Series" "400": description: Bad Request schema: {} @@ -3700,25 +3700,25 @@ paths: schema: {} summary: Update a series by event ID tags: - - event + - event /events/{eventID}/tags: get: description: Retrieves all tags associated with an event operationId: get-tags-by-event parameters: - - description: Event ID - in: path - name: eventID - required: true - type: string + - description: Event ID + in: path + name: eventID + required: true + type: string produces: - - application/json + - application/json responses: "200": description: OK schema: items: - $ref: '#/definitions/models.Tag' + $ref: "#/definitions/models.Tag" type: array "400": description: Bad Request @@ -3731,28 +3731,28 @@ paths: schema: {} summary: Retrieve all tags by event tags: - - event + - event /files/: get: description: Retrieves all files operationId: get-files parameters: - - description: Limit - in: query - name: limit - type: integer - - description: Page - in: query - name: page - type: integer + - description: Limit + in: query + name: limit + type: integer + - description: Page + in: query + name: page + type: integer produces: - - application/json + - application/json responses: "200": description: OK schema: items: - $ref: '#/definitions/models.File' + $ref: "#/definitions/models.File" type: array "400": description: Bad Request @@ -3768,26 +3768,26 @@ paths: schema: {} summary: Retrieve all files tags: - - file + - file post: consumes: - - multipart/form-data + - multipart/form-data description: Creates a file operationId: create-file parameters: - - description: File - in: body - name: file - required: true - schema: - $ref: '#/definitions/models.CreateFileRequestBody' + - description: File + in: body + name: file + required: true + schema: + $ref: "#/definitions/CreateFileRequestBody" produces: - - application/json + - application/json responses: "201": description: Created schema: - $ref: '#/definitions/models.File' + $ref: "#/definitions/models.File" "400": description: Bad Request schema: {} @@ -3802,24 +3802,24 @@ paths: schema: {} summary: Create a file tags: - - file + - file /files/:fileID: delete: description: Deletes a file operationId: delete-file parameters: - - description: File ID - in: path - name: fileID - required: true - type: string + - description: File ID + in: path + name: fileID + required: true + type: string produces: - - application/json + - application/json responses: "201": description: Created schema: - $ref: '#/definitions/models.File' + $ref: "#/definitions/models.File" "400": description: Bad Request schema: {} @@ -3834,23 +3834,23 @@ paths: schema: {} summary: Delete a file tags: - - file + - file get: description: Retrieves a file operationId: get-file parameters: - - description: File ID - in: path - name: fileID - required: true - type: string + - description: File ID + in: path + name: fileID + required: true + type: string produces: - - application/json + - application/json responses: "200": description: OK schema: - $ref: '#/definitions/models.File' + $ref: "#/definitions/models.File" "400": description: Bad Request schema: {} @@ -3865,28 +3865,28 @@ paths: schema: {} summary: Retrieve a file tags: - - file + - file /pocs/: get: description: Retrieves all point of contacts operationId: get-point-of-contacts parameters: - - description: Limit - in: query - name: limit - type: integer - - description: Page - in: query - name: page - type: integer + - description: Limit + in: query + name: limit + type: integer + - description: Page + in: query + name: page + type: integer produces: - - application/json + - application/json responses: "200": description: OK schema: items: - $ref: '#/definitions/models.PointOfContact' + $ref: "#/definitions/models.PointOfContact" type: array "400": description: Bad Request @@ -3902,24 +3902,24 @@ paths: type: string summary: Retrieve all point of contacts tags: - - point of contact + - point of contact /pocs/{pocID}/: get: description: Retrieves a point of contact by id operationId: get-point-of-contact parameters: - - description: Point of Contact ID - in: path - name: pocID - required: true - type: string + - description: Point of Contact ID + in: path + name: pocID + required: true + type: string produces: - - application/json + - application/json responses: "200": description: OK schema: - $ref: '#/definitions/models.PointOfContact' + $ref: "#/definitions/models.PointOfContact" "400": description: Bad Request schema: @@ -3934,28 +3934,28 @@ paths: type: string summary: Retrieves a point of contact tags: - - point of contact + - point of contact /tags: get: description: Retrieves all tags operationId: get-all-tags parameters: - - description: Limit - in: query - name: limit - type: integer - - description: Page - in: query - name: page - type: integer + - description: Limit + in: query + name: limit + type: integer + - description: Page + in: query + name: page + type: integer produces: - - application/json + - application/json responses: "200": description: OK schema: items: - $ref: '#/definitions/models.Tag' + $ref: "#/definitions/models.Tag" type: array "400": description: Bad Request @@ -3968,27 +3968,27 @@ paths: schema: {} summary: Retrieve all tags tags: - - tag + - tag /tags/: post: consumes: - - application/json + - application/json description: Creates a tag operationId: create-tag parameters: - - description: Tag Body - in: body - name: tagBody - required: true - schema: - $ref: '#/definitions/models.CreateTagRequestBody' + - description: Tag Body + in: body + name: tagBody + required: true + schema: + $ref: "#/definitions/CreateTagRequestBody" produces: - - application/json + - application/json responses: "201": description: Created schema: - $ref: '#/definitions/models.Tag' + $ref: "#/definitions/models.Tag" "400": description: Bad Request schema: {} @@ -4003,19 +4003,19 @@ paths: schema: {} summary: Create a tag tags: - - tag + - tag /tags/{tagID}/: delete: description: Deletes a tag operationId: delete-tag parameters: - - description: Tag ID - in: path - name: tagID - required: true - type: string + - description: Tag ID + in: path + name: tagID + required: true + type: string produces: - - application/json + - application/json responses: "204": description: No Content @@ -4035,23 +4035,23 @@ paths: schema: {} summary: Delete a tag tags: - - tag + - tag get: description: Retrieves a tag operationId: get-tag parameters: - - description: Tag ID - in: path - name: tagID - required: true - type: string + - description: Tag ID + in: path + name: tagID + required: true + type: string produces: - - application/json + - application/json responses: "200": description: OK schema: - $ref: '#/definitions/models.Tag' + $ref: "#/definitions/models.Tag" "400": description: Bad Request schema: {} @@ -4063,31 +4063,31 @@ paths: schema: {} summary: Retrieve a tag tags: - - tag + - tag patch: consumes: - - application/json + - application/json description: Updates a tag operationId: update-tag parameters: - - description: Tag ID - in: path - name: tagID - required: true - type: string - - description: Tag - in: body - name: tag - required: true - schema: - $ref: '#/definitions/models.UpdateTagRequestBody' + - description: Tag ID + in: path + name: tagID + required: true + type: string + - description: Tag + in: body + name: tag + required: true + schema: + $ref: "#/definitions/UpdateTagRequestBody" produces: - - application/json + - application/json responses: "200": description: OK schema: - $ref: '#/definitions/models.Tag' + $ref: "#/definitions/models.Tag" "400": description: Bad Request schema: {} @@ -4102,28 +4102,28 @@ paths: schema: {} summary: Update a tag tags: - - tag + - tag /users/: get: description: Retrieves all users operationId: get-users parameters: - - description: Limit - in: query - name: limit - type: integer - - description: Page - in: query - name: page - type: integer + - description: Limit + in: query + name: limit + type: integer + - description: Page + in: query + name: page + type: integer produces: - - application/json + - application/json responses: "200": description: OK schema: items: - $ref: '#/definitions/models.User' + $ref: "#/definitions/models.User" type: array "400": description: Bad Request @@ -4136,26 +4136,26 @@ paths: schema: {} summary: Retrieve all users tags: - - user + - user post: consumes: - - application/json + - application/json description: Creates a user operationId: create-user parameters: - - description: User Body - in: body - name: userBody - required: true - schema: - $ref: '#/definitions/models.CreateUserRequestBody' + - description: User Body + in: body + name: userBody + required: true + schema: + $ref: "#/definitions/CreateUserRequestBody" produces: - - application/json + - application/json responses: "201": description: Created schema: - $ref: '#/definitions/models.User' + $ref: "#/definitions/models.User" "400": description: Bad Request schema: {} @@ -4173,19 +4173,19 @@ paths: schema: {} summary: Create a user tags: - - user + - user /users/{userID}/: delete: description: Deletes a user operationId: delete-user parameters: - - description: User ID - in: path - name: userID - required: true - type: string + - description: User ID + in: path + name: userID + required: true + type: string produces: - - application/json + - application/json responses: "204": description: No Content @@ -4205,23 +4205,23 @@ paths: schema: {} summary: Delete a user tags: - - user + - user get: description: Retrieves a user operationId: get-user parameters: - - description: User ID - in: path - name: userID - required: true - type: string + - description: User ID + in: path + name: userID + required: true + type: string produces: - - application/json + - application/json responses: "200": description: OK schema: - $ref: '#/definitions/models.User' + $ref: "#/definitions/models.User" "400": description: Bad Request schema: {} @@ -4236,31 +4236,31 @@ paths: schema: {} summary: Retrieve a user tags: - - user + - user patch: consumes: - - application/json + - application/json description: Updates a user operationId: update-user parameters: - - description: User ID - in: path - name: userID - required: true - type: string - - description: User Body - in: body - name: userBody - required: true - schema: - $ref: '#/definitions/models.UpdateUserRequestBody' + - description: User ID + in: path + name: userID + required: true + type: string + - description: User Body + in: body + name: userBody + required: true + schema: + $ref: "#/definitions/UpdateUserRequestBody" produces: - - application/json + - application/json responses: "200": description: OK schema: - $ref: '#/definitions/models.User' + $ref: "#/definitions/models.User" "400": description: Bad Request schema: {} @@ -4275,25 +4275,25 @@ paths: schema: {} summary: Update a user tags: - - user + - user /users/{userID}/follower/: get: description: Retrieves all clubs a user is following operationId: get-following parameters: - - description: User ID - in: path - name: userID - required: true - type: string + - description: User ID + in: path + name: userID + required: true + type: string produces: - - application/json + - application/json responses: "200": description: OK schema: items: - $ref: '#/definitions/models.Club' + $ref: "#/definitions/models.Club" type: array "400": description: Bad Request @@ -4309,31 +4309,31 @@ paths: schema: {} summary: Retrieve all clubs a user is following tags: - - user-follower + - user-follower /users/{userID}/follower/{clubID}/: delete: consumes: - - application/json + - application/json description: Unfollow a club operationId: delete-following parameters: - - description: User ID - in: path - name: userID - required: true - type: string - - description: Club ID - in: path - name: clubID - required: true - type: string + - description: User ID + in: path + name: userID + required: true + type: string + - description: Club ID + in: path + name: clubID + required: true + type: string produces: - - application/json + - application/json responses: "204": description: No Content schema: - $ref: '#/definitions/utilities.SuccessResponse' + $ref: "#/definitions/utilities.SuccessResponse" "401": description: Unauthorized schema: {} @@ -4345,30 +4345,30 @@ paths: schema: {} summary: Unfollow a club tags: - - user-follower + - user-follower post: consumes: - - application/json + - application/json description: Follow a club operationId: create-following parameters: - - description: User ID - in: path - name: userID - required: true - type: string - - description: Club ID - in: path - name: clubID - required: true - type: string + - description: User ID + in: path + name: userID + required: true + type: string + - description: Club ID + in: path + name: clubID + required: true + type: string produces: - - application/json + - application/json responses: "201": description: Created schema: - $ref: '#/definitions/utilities.SuccessResponse' + $ref: "#/definitions/utilities.SuccessResponse" "401": description: Unauthorized schema: {} @@ -4380,25 +4380,25 @@ paths: schema: {} summary: Follow a club tags: - - user-follower + - user-follower /users/{userID}/member/: get: description: Retrieves all clubs a user is a member of operationId: get-membership parameters: - - description: User ID - in: path - name: userID - required: true - type: string + - description: User ID + in: path + name: userID + required: true + type: string produces: - - application/json + - application/json responses: "200": description: OK schema: items: - $ref: '#/definitions/models.Club' + $ref: "#/definitions/models.Club" type: array "400": description: Bad Request @@ -4414,27 +4414,27 @@ paths: schema: {} summary: Retrieve all clubs a user is a member of tags: - - user-member + - user-member /users/{userID}/password: patch: consumes: - - application/json + - application/json description: Updates a user's password operationId: update-password parameters: - - description: User ID - in: path - name: userID - required: true - type: string - - description: Password Body - in: body - name: passwordBody - required: true - schema: - $ref: '#/definitions/models.UpdatePasswordRequestBody' + - description: User ID + in: path + name: userID + required: true + type: string + - description: Password Body + in: body + name: passwordBody + required: true + schema: + $ref: "#/definitions/models.UpdatePasswordRequestBody" produces: - - application/json + - application/json responses: "200": description: OK @@ -4454,21 +4454,21 @@ paths: schema: {} summary: Update a user's password tags: - - user + - user /users/{userID}/tags/: delete: consumes: - - application/json + - application/json description: Creates tags for a user operationId: create-user-tags parameters: - - description: User ID - in: path - name: userID - required: true - type: string + - description: User ID + in: path + name: userID + required: true + type: string produces: - - application/json + - application/json responses: "201": description: Created @@ -4486,24 +4486,24 @@ paths: schema: {} summary: Create user tags tags: - - user-tag + - user-tag get: description: Retrieves all tags associated with a user operationId: get-tags-by-user parameters: - - description: User ID - in: path - name: userID - required: true - type: string + - description: User ID + in: path + name: userID + required: true + type: string produces: - - application/json + - application/json responses: "200": description: OK schema: items: - $ref: '#/definitions/models.Tag' + $ref: "#/definitions/models.Tag" type: array "400": description: Bad Request @@ -4519,32 +4519,32 @@ paths: schema: {} summary: Retrieve all tags for a user tags: - - user-tag + - user-tag post: consumes: - - application/json + - application/json description: Creates tags for a user operationId: create-user-tags parameters: - - description: User ID - in: path - name: userID - required: true - type: string - - description: User Tags Body - in: body - name: userTagsBody - required: true - schema: - $ref: '#/definitions/tag.CreateUserTagsBody' + - description: User ID + in: path + name: userID + required: true + type: string + - description: User Tags Body + in: body + name: userTagsBody + required: true + schema: + $ref: "#/definitions/tag.CreateUserTagsBody" produces: - - application/json + - application/json responses: "201": description: Created schema: items: - $ref: '#/definitions/models.Tag' + $ref: "#/definitions/models.Tag" type: array "400": description: Bad Request @@ -4560,5 +4560,5 @@ paths: schema: {} summary: Create user tags tags: - - user-tag + - user-tag swagger: "2.0" diff --git a/backend/entities/auth/base/controller.go b/backend/entities/auth/base/controller.go index a39ac83e7..6c77710d0 100644 --- a/backend/entities/auth/base/controller.go +++ b/backend/entities/auth/base/controller.go @@ -4,7 +4,9 @@ import ( "net/http" "github.com/GenerateNU/sac/backend/auth" + authEntities "github.com/GenerateNU/sac/backend/entities/auth" "github.com/GenerateNU/sac/backend/entities/models" + users "github.com/GenerateNU/sac/backend/entities/users/base" "github.com/GenerateNU/sac/backend/utilities" "github.com/gofiber/fiber/v2" ) @@ -25,14 +27,14 @@ func NewAuthController(authService AuthServiceInterface) *AuthController { // @Tags auth // @Accept json // @Produce json -// @Param loginBody body models.LoginUserResponseBody true "Login Body" +// @Param loginBody body authEntities.LoginResponseBody true "Login Body" // @Success 200 {object} models.User // @Failure 400 {object} error // @Failure 404 {object} error // @Failure 500 {object} error // @Router /auth/login [post] func (a *AuthController) Login(c *fiber.Ctx) error { - var userBody models.LoginUserResponseBody + var userBody authEntities.LoginResponseBody if err := c.BodyParser(&userBody); err != nil { return utilities.InvalidJSON() @@ -59,14 +61,14 @@ func (a *AuthController) Login(c *fiber.Ctx) error { // @Tags auth // @Accept json // @Produce json -// @Param userBody body models.CreateUserRequestBody true "User Body" +// @Param userBody body CreateUserRequestBody true "User Body" // @Success 201 {object} models.User // @Failure 400 {object} error // @Failure 404 {object} error // @Failure 500 {object} error // @Router /auth/register [post] func (a *AuthController) Register(c *fiber.Ctx) error { - var userBody models.CreateUserRequestBody + var userBody users.CreateUserRequestBody if err := c.BodyParser(&userBody); err != nil { return utilities.InvalidJSON() @@ -99,7 +101,7 @@ func (a *AuthController) Register(c *fiber.Ctx) error { // @Failure 500 {object} error // @Router /auth/refresh [post] func (a *AuthController) Refresh(c *fiber.Ctx) error { - var refreshBody models.RefreshTokenRequestBody + var refreshBody authEntities.RefreshTokenRequestBody if err := c.BodyParser(&refreshBody); err != nil { return utilities.InvalidJSON() diff --git a/backend/entities/auth/base/service.go b/backend/entities/auth/base/service.go index ae448c390..679591f86 100644 --- a/backend/entities/auth/base/service.go +++ b/backend/entities/auth/base/service.go @@ -7,8 +7,10 @@ import ( "time" "github.com/GenerateNU/sac/backend/auth" + authEntities "github.com/GenerateNU/sac/backend/entities/auth" "github.com/GenerateNU/sac/backend/entities/models" "github.com/GenerateNU/sac/backend/entities/users" + usersEntities "github.com/GenerateNU/sac/backend/entities/users/base" "github.com/GenerateNU/sac/backend/types" "github.com/GenerateNU/sac/backend/utilities" @@ -20,8 +22,8 @@ import ( type AuthServiceInterface interface { GetRole(id string) (*models.UserRole, error) - Register(userBody models.CreateUserRequestBody) (*models.User, *auth.Token, error) - Login(userBody models.LoginUserResponseBody) (*models.User, *auth.Token, error) + Register(userBody usersEntities.CreateUserRequestBody) (*models.User, *auth.Token, error) + Login(userBody authEntities.LoginResponseBody) (*models.User, *auth.Token, error) Refresh(refreshToken string) (*auth.Token, error) Logout(c *fiber.Ctx) error @@ -40,7 +42,7 @@ func NewAuthService(serviceParams types.ServiceParams) AuthServiceInterface { return &AuthService{serviceParams} } -func (a *AuthService) Login(loginBody models.LoginUserResponseBody) (*models.User, *auth.Token, error) { +func (a *AuthService) Login(loginBody authEntities.LoginResponseBody) (*models.User, *auth.Token, error) { if err := utilities.Validate(a.Validate, loginBody); err != nil { return nil, nil, err } @@ -80,7 +82,7 @@ func (a *AuthService) Login(loginBody models.LoginUserResponseBody) (*models.Use return user, tokens, nil } -func (a *AuthService) Register(userBody models.CreateUserRequestBody) (*models.User, *auth.Token, error) { +func (a *AuthService) Register(userBody usersEntities.CreateUserRequestBody) (*models.User, *auth.Token, error) { if err := utilities.Validate(a.Validate, userBody); err != nil { return nil, nil, err } @@ -115,7 +117,7 @@ func (a *AuthService) Register(userBody models.CreateUserRequestBody) (*models.U return nil, nil, err } - _, tokens, err := a.Login(models.LoginUserResponseBody{Email: user.Email, Password: userBody.Password}) + _, tokens, err := a.Login(authEntities.LoginResponseBody{Email: user.Email, Password: userBody.Password}) if err != nil { return nil, nil, err } diff --git a/backend/entities/auth/models.go b/backend/entities/auth/models.go new file mode 100644 index 000000000..7272b50d8 --- /dev/null +++ b/backend/entities/auth/models.go @@ -0,0 +1,15 @@ +package auth + +type LoginResponseBody struct { + Email string `json:"email" validate:"required,email"` + Password string `json:"password" validate:"required,max=255"` // MARK: must be validated manually +} + +type UpdatePasswordRequestBody struct { + OldPassword string `json:"old_password" validate:"required,max=255"` // MARK: must be validated manually + NewPassword string `json:"new_password" validate:"required,not_equal_if_not_empty=OldPassword,max=255"` // MARK: must be validated manually +} + +type RefreshTokenRequestBody struct { + RefreshToken string `json:"refresh_token" validate:"required"` +} diff --git a/backend/entities/categories/base/controller.go b/backend/entities/categories/base/controller.go index decf48f0f..2ec179336 100644 --- a/backend/entities/categories/base/controller.go +++ b/backend/entities/categories/base/controller.go @@ -3,7 +3,7 @@ package base import ( "net/http" - "github.com/GenerateNU/sac/backend/entities/models" + "github.com/GenerateNU/sac/backend/entities/categories" "github.com/GenerateNU/sac/backend/utilities" "github.com/garrettladley/fiberpaginate" @@ -26,7 +26,7 @@ func NewCategoryController(categoryService CategoryServiceInterface) *CategoryCo // @Tags category // @Accept json // @Produce json -// @Param categoryBody body models.CategoryRequestBody true "Category Body" +// @Param categoryBody body categories.CategoryRequestBody true "Category Body" // @Success 201 {object} models.Category // @Failure 400 {string} error // @Failure 401 {string} error @@ -35,7 +35,7 @@ func NewCategoryController(categoryService CategoryServiceInterface) *CategoryCo // @Failure 500 {string} error // @Router /categories/ [post] func (cat *CategoryController) CreateCategory(c *fiber.Ctx) error { - var categoryBody models.CategoryRequestBody + var categoryBody categories.CategoryRequestBody if err := c.BodyParser(&categoryBody); err != nil { return utilities.InvalidJSON() @@ -130,7 +130,7 @@ func (cat *CategoryController) DeleteCategory(c *fiber.Ctx) error { // @Accept json // @Produce json // @Param categoryID path string true "Category ID" -// @Param categoryBody body models.CategoryRequestBody true "Category Body" +// @Param categoryBody body categories.CategoryRequestBody true "Category Body" // @Success 200 {object} models.Category // @Failure 400 {string} error // @Failure 401 {string} error @@ -138,7 +138,7 @@ func (cat *CategoryController) DeleteCategory(c *fiber.Ctx) error { // @Failure 500 {string} error // @Router /categories/{categoryID}/ [patch] func (cat *CategoryController) UpdateCategory(c *fiber.Ctx) error { - var category models.CategoryRequestBody + var category categories.CategoryRequestBody if err := c.BodyParser(&category); err != nil { return utilities.InvalidJSON() } diff --git a/backend/entities/categories/base/service.go b/backend/entities/categories/base/service.go index 719aff104..47d13cdaa 100644 --- a/backend/entities/categories/base/service.go +++ b/backend/entities/categories/base/service.go @@ -1,6 +1,7 @@ package base import ( + "github.com/GenerateNU/sac/backend/entities/categories" "github.com/GenerateNU/sac/backend/entities/models" "github.com/GenerateNU/sac/backend/types" "github.com/GenerateNU/sac/backend/utilities" @@ -11,10 +12,10 @@ import ( ) type CategoryServiceInterface interface { - CreateCategory(categoryBody models.CategoryRequestBody) (*models.Category, error) + CreateCategory(categoryBody categories.CategoryRequestBody) (*models.Category, error) GetCategories(pageInfo fiberpaginate.PageInfo) ([]models.Category, error) GetCategory(id string) (*models.Category, error) - UpdateCategory(id string, params models.CategoryRequestBody) (*models.Category, error) + UpdateCategory(id string, params categories.CategoryRequestBody) (*models.Category, error) DeleteCategory(id string) error } @@ -26,7 +27,7 @@ func NewCategoryService(params types.ServiceParams) CategoryServiceInterface { return &CategoryService{params} } -func (c *CategoryService) CreateCategory(categoryBody models.CategoryRequestBody) (*models.Category, error) { +func (c *CategoryService) CreateCategory(categoryBody categories.CategoryRequestBody) (*models.Category, error) { if err := utilities.Validate(c.Validate, categoryBody); err != nil { return nil, err } @@ -54,7 +55,7 @@ func (c *CategoryService) GetCategory(id string) (*models.Category, error) { return GetCategory(c.DB, *idAsUUID) } -func (c *CategoryService) UpdateCategory(id string, categoryBody models.CategoryRequestBody) (*models.Category, error) { +func (c *CategoryService) UpdateCategory(id string, categoryBody categories.CategoryRequestBody) (*models.Category, error) { idAsUUID, err := utilities.ValidateID(id) if err != nil { return nil, err diff --git a/backend/entities/categories/models.go b/backend/entities/categories/models.go new file mode 100644 index 000000000..18285b996 --- /dev/null +++ b/backend/entities/categories/models.go @@ -0,0 +1,5 @@ +package categories + +type CategoryRequestBody struct { + Name string `json:"name" validate:"required,max=255"` +} diff --git a/backend/entities/clubs/base/controller.go b/backend/entities/clubs/base/controller.go index 3ffd49b9a..add4ae5b5 100644 --- a/backend/entities/clubs/base/controller.go +++ b/backend/entities/clubs/base/controller.go @@ -57,7 +57,7 @@ func (cl *ClubController) GetClubs(c *fiber.Ctx) error { // @Tags club // @Accept json // @Produce json -// @Param club body models.CreateClubRequestBody true "Club" +// @Param club body CreateClubRequestBody true "Club" // @Success 201 {object} models.Club // @Failure 400 {object} error // @Failure 401 {object} error @@ -65,7 +65,7 @@ func (cl *ClubController) GetClubs(c *fiber.Ctx) error { // @Failure 500 {object} error // @Router /clubs/ [post] func (cl *ClubController) CreateClub(c *fiber.Ctx) error { - var clubBody models.CreateClubRequestBody + var clubBody CreateClubRequestBody if err := c.BodyParser(&clubBody); err != nil { return utilities.InvalidJSON() @@ -110,7 +110,7 @@ func (cl *ClubController) GetClub(c *fiber.Ctx) error { // @Accept json // @Produce json // @Param clubID path string true "Club ID" -// @Param club body models.UpdateClubRequestBody true "Club" +// @Param club body UpdateClubRequestBody true "Club" // @Success 200 {object} models.Club // @Failure 400 {object} error // @Failure 401 {object} error @@ -118,7 +118,7 @@ func (cl *ClubController) GetClub(c *fiber.Ctx) error { // @Failure 500 {object} error // @Router /clubs/{clubID}/ [patch] func (cl *ClubController) UpdateClub(c *fiber.Ctx) error { - var clubBody models.UpdateClubRequestBody + var clubBody UpdateClubRequestBody if err := c.BodyParser(&clubBody); err != nil { return utilities.InvalidJSON() diff --git a/backend/entities/clubs/base/models.go b/backend/entities/clubs/base/models.go new file mode 100644 index 000000000..e0a6b63f1 --- /dev/null +++ b/backend/entities/clubs/base/models.go @@ -0,0 +1,33 @@ +package base + +import ( + "github.com/GenerateNU/sac/backend/entities/models" + "github.com/google/uuid" +) + +type CreateClubRequestBody struct { + UserID uuid.UUID `json:"user_id" validate:"required,uuid4"` + Name string `json:"name" validate:"required,max=255"` + Preview string `json:"preview" validate:"required,max=255"` + Description string `json:"description" validate:"required,http_url,s3_url,max=255"` + IsRecruiting bool `json:"is_recruiting" validate:"required"` + RecruitmentCycle models.RecruitmentCycle `json:"recruitment_cycle" validate:"required,max=255,oneof=fall spring fallSpring always"` + RecruitmentType models.RecruitmentType `json:"recruitment_type" validate:"required,max=255,oneof=unrestricted tryout application"` + WeeklyTimeCommitment *int `json:"weekly_time_commitment" validate:"omitempty,min=1"` + OneWordToDescribeUs string `json:"one_word_to_describe_us" validate:"omitempty,max=255"` + ApplicationLink string `json:"application_link" validate:"required,max=255,http_url"` + Logo string `json:"logo" validate:"omitempty,http_url,s3_url,max=255"` +} + +type UpdateClubRequestBody struct { + Name string `json:"name" validate:"omitempty,max=255"` + Preview string `json:"preview" validate:"omitempty,max=255"` + Description string `json:"description" validate:"omitempty,http_url,s3_url,max=255"` + IsRecruiting bool `json:"is_recruiting" validate:"omitempty"` + RecruitmentCycle models.RecruitmentCycle `json:"recruitment_cycle" validate:"required,max=255,oneof=fall spring fallSpring always"` + RecruitmentType models.RecruitmentType `json:"recruitment_type" validate:"required,max=255,oneof=unrestricted tryout application"` + WeeklyTimeCommitment *int `json:"weekly_time_commitment" validate:"omitempty,min=1"` + OneWordToDescribeUs string `json:"one_word_to_describe_us" validate:"omitempty,max=255"` + ApplicationLink string `json:"application_link" validate:"omitempty,required,max=255,http_url"` + Logo string `json:"logo" validate:"omitempty,s3_url,max=255,http_url"` +} diff --git a/backend/entities/clubs/base/service.go b/backend/entities/clubs/base/service.go index 413ae33ce..6891aeb1d 100644 --- a/backend/entities/clubs/base/service.go +++ b/backend/entities/clubs/base/service.go @@ -13,8 +13,8 @@ import ( type ClubServiceInterface interface { GetClubs(queryParams *models.ClubQueryParams, pageInfo fiberpaginate.PageInfo) ([]models.Club, error) GetClub(id string) (*models.Club, error) - CreateClub(clubBody models.CreateClubRequestBody) (*models.Club, error) - UpdateClub(id string, clubBody models.UpdateClubRequestBody) (*models.Club, error) + CreateClub(clubBody CreateClubRequestBody) (*models.Club, error) + UpdateClub(id string, clubBody UpdateClubRequestBody) (*models.Club, error) DeleteClub(id string) error } @@ -30,7 +30,7 @@ func (c *ClubService) GetClubs(queryParams *models.ClubQueryParams, pageInfo fib return GetClubs(c.DB, c.Integrations.Search, queryParams, pageInfo) } -func (c *ClubService) CreateClub(clubBody models.CreateClubRequestBody) (*models.Club, error) { +func (c *ClubService) CreateClub(clubBody CreateClubRequestBody) (*models.Club, error) { if err := utilities.Validate(c.Validate, clubBody); err != nil { return nil, err } @@ -52,13 +52,13 @@ func (c *ClubService) GetClub(id string) (*models.Club, error) { return clubs.GetClub(c.DB, *idAsUUID) } -func (c *ClubService) UpdateClub(id string, clubBody models.UpdateClubRequestBody) (*models.Club, error) { +func (c *ClubService) UpdateClub(id string, clubBody UpdateClubRequestBody) (*models.Club, error) { idAsUUID, err := utilities.ValidateID(id) if err != nil { return nil, err } - if utilities.AtLeastOne(clubBody, models.UpdateClubRequestBody{}) { + if utilities.AtLeastOne(clubBody, UpdateClubRequestBody{}) { return nil, fmt.Errorf("at least one field must be present") } diff --git a/backend/entities/clubs/contacts/controller.go b/backend/entities/clubs/contacts/controller.go index 9ac8c382e..ac0bb51b9 100644 --- a/backend/entities/clubs/contacts/controller.go +++ b/backend/entities/clubs/contacts/controller.go @@ -3,7 +3,6 @@ package contacts import ( "net/http" - "github.com/GenerateNU/sac/backend/entities/models" "github.com/GenerateNU/sac/backend/utilities" "github.com/gofiber/fiber/v2" ) @@ -47,7 +46,7 @@ func (cc *ClubContactController) GetClubContacts(c *fiber.Ctx) error { // @Accept json // @Produce json // @Param clubID path string true "Club ID" -// @Param contactBody body models.PutContactRequestBody true "Contact Body" +// @Param contactBody body PutContactRequestBody true "Contact Body" // @Success 201 {object} models.Contact // @Failure 400 {object} error // @Failure 401 {object} error @@ -55,7 +54,7 @@ func (cc *ClubContactController) GetClubContacts(c *fiber.Ctx) error { // @Failure 500 {object} error // @Router /clubs/{clubID}/contacts/ [put] func (cc *ClubContactController) PutContact(c *fiber.Ctx) error { - var contactBody models.PutContactRequestBody + var contactBody PutContactRequestBody if err := c.BodyParser(&contactBody); err != nil { return utilities.InvalidJSON() diff --git a/backend/entities/clubs/contacts/models.go b/backend/entities/clubs/contacts/models.go new file mode 100644 index 000000000..26c5cf1dd --- /dev/null +++ b/backend/entities/clubs/contacts/models.go @@ -0,0 +1,8 @@ +package contacts + +import "github.com/GenerateNU/sac/backend/entities/models" + +type PutContactRequestBody struct { + Type models.ContactType `json:"type" validate:"required,max=255,oneof=facebook instagram x linkedin youtube github slack discord email customSite"` + Content string `json:"content" validate:"required,contact_pointer,max=255"` +} diff --git a/backend/entities/clubs/contacts/service.go b/backend/entities/clubs/contacts/service.go index 834dfc506..5c12bd409 100644 --- a/backend/entities/clubs/contacts/service.go +++ b/backend/entities/clubs/contacts/service.go @@ -8,7 +8,7 @@ import ( type ClubContactServiceInterface interface { GetClubContacts(clubID string) ([]models.Contact, error) - PutClubContact(clubID string, contactBody models.PutContactRequestBody) (*models.Contact, error) + PutClubContact(clubID string, contactBody PutContactRequestBody) (*models.Contact, error) } type ClubContactService struct { @@ -28,7 +28,7 @@ func (c *ClubContactService) GetClubContacts(clubID string) ([]models.Contact, e return GetClubContacts(c.DB, *idAsUUID) } -func (c *ClubContactService) PutClubContact(clubID string, contactBody models.PutContactRequestBody) (*models.Contact, error) { +func (c *ClubContactService) PutClubContact(clubID string, contactBody PutContactRequestBody) (*models.Contact, error) { idAsUUID, err := utilities.ValidateID(clubID) if err != nil { return nil, err diff --git a/backend/entities/clubs/pocs/controller.go b/backend/entities/clubs/pocs/controller.go index 099b2f5c7..8d9de7e6f 100644 --- a/backend/entities/clubs/pocs/controller.go +++ b/backend/entities/clubs/pocs/controller.go @@ -3,7 +3,6 @@ package pocs import ( "net/http" - "github.com/GenerateNU/sac/backend/entities/models" "github.com/GenerateNU/sac/backend/utilities" "github.com/gofiber/fiber/v2" ) @@ -108,7 +107,7 @@ func (cpoc *ClubPointOfContactController) UpdateClubPointOfContactPhoto(c *fiber // @Failure 500 {object} error // @Router /clubs/{clubID}/poc/{pocID} [put] func (cpoc *ClubPointOfContactController) UpdateClubPointOfContact(c *fiber.Ctx) error { - var pointOfContactBody models.UpdatePointOfContactBody + var pointOfContactBody UpdatePointOfContactBody if err := c.BodyParser(&pointOfContactBody); err != nil { return utilities.InvalidJSON() @@ -138,7 +137,7 @@ func (cpoc *ClubPointOfContactController) UpdateClubPointOfContact(c *fiber.Ctx) // @Failure 500 {object} error // @Router /clubs/{clubID}/poc/ [post] func (cpoc *ClubPointOfContactController) CreateClubPointOfContact(c *fiber.Ctx) error { - var pointOfContactBody models.CreatePointOfContactBody + var pointOfContactBody CreatePointOfContactBody if err := c.BodyParser(&pointOfContactBody); err != nil { return utilities.InvalidJSON() diff --git a/backend/entities/clubs/pocs/models.go b/backend/entities/clubs/pocs/models.go new file mode 100644 index 000000000..85fa0a9dd --- /dev/null +++ b/backend/entities/clubs/pocs/models.go @@ -0,0 +1,13 @@ +package pocs + +type CreatePointOfContactBody struct { + Name string `json:"name" validate:"required,max=255"` + Email string `json:"email" validate:"required,email,max=255"` + Position string `json:"position" validate:"required,max=255"` +} + +type UpdatePointOfContactBody struct { + Name string `json:"name" validate:"omitempty,max=255"` + Email string `json:"email" validate:"omitempty,email,max=255"` + Position string `json:"position" validate:"omitempty,max=255"` +} diff --git a/backend/entities/clubs/pocs/service.go b/backend/entities/clubs/pocs/service.go index 622304bc7..82472507e 100644 --- a/backend/entities/clubs/pocs/service.go +++ b/backend/entities/clubs/pocs/service.go @@ -14,9 +14,9 @@ import ( type ClubPointOfContactServiceInterface interface { GetClubPointOfContacts(clubID string) ([]models.PointOfContact, error) GetClubPointOfContact(clubID, pocID string) (*models.PointOfContact, error) - CreateClubPointOfContact(clubID string, pointOfContactBody models.CreatePointOfContactBody, fileHeader *multipart.FileHeader) (*models.PointOfContact, error) + CreateClubPointOfContact(clubID string, pointOfContactBody CreatePointOfContactBody, fileHeader *multipart.FileHeader) (*models.PointOfContact, error) UpdateClubPointOfContactPhoto(clubID, pocID string, fileHeader *multipart.FileHeader) (*models.PointOfContact, error) - UpdateClubPointOfContact(clubID, pocID string, pointOfContactBody models.UpdatePointOfContactBody) (*models.PointOfContact, error) + UpdateClubPointOfContact(clubID, pocID string, pointOfContactBody UpdatePointOfContactBody) (*models.PointOfContact, error) DeleteClubPointOfContact(clubID, pocID string) error } @@ -51,7 +51,7 @@ func (cpoc *ClubPointOfContactService) GetClubPointOfContact(clubID, pocID strin return GetClubPointOfContact(cpoc.DB, *clubIdAsUUID, *pocIdAsUUID) } -func (cpoc *ClubPointOfContactService) CreateClubPointOfContact(clubID string, pointOfContactBody models.CreatePointOfContactBody, fileHeader *multipart.FileHeader) (*models.PointOfContact, error) { +func (cpoc *ClubPointOfContactService) CreateClubPointOfContact(clubID string, pointOfContactBody CreatePointOfContactBody, fileHeader *multipart.FileHeader) (*models.PointOfContact, error) { if err := utilities.Validate(cpoc.Validate, pointOfContactBody); err != nil { return nil, err } @@ -138,7 +138,7 @@ func (cpoc *ClubPointOfContactService) UpdateClubPointOfContactPhoto(clubID, poc return pointOfContact, nil } -func (cpoc *ClubPointOfContactService) UpdateClubPointOfContact(clubID, pocID string, pointOfContactBody models.UpdatePointOfContactBody) (*models.PointOfContact, error) { +func (cpoc *ClubPointOfContactService) UpdateClubPointOfContact(clubID, pocID string, pointOfContactBody UpdatePointOfContactBody) (*models.PointOfContact, error) { if err := utilities.Validate(cpoc.Validate, pointOfContactBody); err != nil { return nil, err } diff --git a/backend/entities/clubs/pocs/transactions.go b/backend/entities/clubs/pocs/transactions.go index f1158b756..5233fdfaa 100644 --- a/backend/entities/clubs/pocs/transactions.go +++ b/backend/entities/clubs/pocs/transactions.go @@ -51,7 +51,7 @@ func GetClubPointOfContactByClubIDAndEmail(db *gorm.DB, clubID uuid.UUID, email return &pointOfContact, nil } -func CreateClubPointOfContact(db *gorm.DB, clubID uuid.UUID, pointOfContactBody models.CreatePointOfContactBody) (*models.PointOfContact, error) { +func CreateClubPointOfContact(db *gorm.DB, clubID uuid.UUID, pointOfContactBody CreatePointOfContactBody) (*models.PointOfContact, error) { pointOfContact := models.PointOfContact{ Name: pointOfContactBody.Name, Email: pointOfContactBody.Email, @@ -65,7 +65,7 @@ func CreateClubPointOfContact(db *gorm.DB, clubID uuid.UUID, pointOfContactBody return &pointOfContact, nil } -func UpdateClubPointOfContact(db *gorm.DB, clubID uuid.UUID, pocID uuid.UUID, pointOfContactBody models.UpdatePointOfContactBody) (*models.PointOfContact, error) { +func UpdateClubPointOfContact(db *gorm.DB, clubID uuid.UUID, pocID uuid.UUID, pointOfContactBody UpdatePointOfContactBody) (*models.PointOfContact, error) { pointOfContact, err := GetClubPointOfContact(db, clubID, pocID) if err != nil { return nil, err diff --git a/backend/entities/clubs/tags/controller.go b/backend/entities/clubs/tags/controller.go index 9bad2bf23..597bef7a3 100644 --- a/backend/entities/clubs/tags/controller.go +++ b/backend/entities/clubs/tags/controller.go @@ -3,7 +3,6 @@ package tags import ( "net/http" - "github.com/GenerateNU/sac/backend/entities/models" "github.com/GenerateNU/sac/backend/utilities" "github.com/gofiber/fiber/v2" ) @@ -25,7 +24,7 @@ func NewClubTagController(clubTagService ClubTagServiceInterface) *ClubTagContro // @Accept json // @Produce json // @Param clubID path string true "Club ID" -// @Param clubTagsBody body models.CreateClubTagsRequestBody true "Club Tags Body" +// @Param clubTagsBody body CreateClubTagsRequestBody true "Club Tags Body" // @Success 201 {object} []models.Tag // @Failure 400 {object} error // @Failure 401 {object} error @@ -33,7 +32,7 @@ func NewClubTagController(clubTagService ClubTagServiceInterface) *ClubTagContro // @Failure 500 {object} error // @Router /clubs/{clubID}/tags/ [post] func (l *ClubTagController) CreateClubTags(c *fiber.Ctx) error { - var clubTagsBody models.CreateClubTagsRequestBody + var clubTagsBody CreateClubTagsRequestBody if err := c.BodyParser(&clubTagsBody); err != nil { return utilities.InvalidJSON() } diff --git a/backend/entities/clubs/tags/models.go b/backend/entities/clubs/tags/models.go new file mode 100644 index 000000000..36f6e0bb8 --- /dev/null +++ b/backend/entities/clubs/tags/models.go @@ -0,0 +1,7 @@ +package tags + +import "github.com/google/uuid" + +type CreateClubTagsRequestBody struct { + Tags []uuid.UUID `json:"tags" validate:"required"` +} diff --git a/backend/entities/clubs/tags/service.go b/backend/entities/clubs/tags/service.go index 8ae50e7eb..bff249500 100644 --- a/backend/entities/clubs/tags/service.go +++ b/backend/entities/clubs/tags/service.go @@ -8,7 +8,7 @@ import ( ) type ClubTagServiceInterface interface { - CreateClubTags(id string, clubTagsBody models.CreateClubTagsRequestBody) ([]models.Tag, error) + CreateClubTags(id string, clubTagsBody CreateClubTagsRequestBody) ([]models.Tag, error) GetClubTags(id string) ([]models.Tag, error) DeleteClubTag(id string, tagId string) error } @@ -21,7 +21,7 @@ func NewClubTagService(serviceParams types.ServiceParams) ClubTagServiceInterfac return &ClubTagService{serviceParams} } -func (c *ClubTagService) CreateClubTags(id string, clubTagsBody models.CreateClubTagsRequestBody) ([]models.Tag, error) { +func (c *ClubTagService) CreateClubTags(id string, clubTagsBody CreateClubTagsRequestBody) ([]models.Tag, error) { idAsUUID, err := utilities.ValidateID(id) if err != nil { return nil, err diff --git a/backend/entities/events/base/controller.go b/backend/entities/events/base/controller.go index 6fcdf2ace..e53934759 100644 --- a/backend/entities/events/base/controller.go +++ b/backend/entities/events/base/controller.go @@ -3,7 +3,7 @@ package base import ( "net/http" - "github.com/GenerateNU/sac/backend/entities/models" + "github.com/GenerateNU/sac/backend/entities/events" "github.com/GenerateNU/sac/backend/utilities" "github.com/garrettladley/fiberpaginate" "github.com/gofiber/fiber/v2" @@ -68,7 +68,7 @@ func (e *EventController) GetEvent(c *fiber.Ctx) error { } func (e *EventController) CreateEvent(c *fiber.Ctx) error { - var body models.CreateEventRequestBody + var body events.CreateEventRequestBody if err := c.BodyParser(&body); err != nil { return err } @@ -82,7 +82,7 @@ func (e *EventController) CreateEvent(c *fiber.Ctx) error { } func (e *EventController) UpdateEvent(c *fiber.Ctx) error { - var body models.UpdateEventRequestBody + var body events.UpdateEventRequestBody if err := c.BodyParser(&body); err != nil { return err } diff --git a/backend/entities/events/base/service.go b/backend/entities/events/base/service.go index 53521a068..0f7c9fa1e 100644 --- a/backend/entities/events/base/service.go +++ b/backend/entities/events/base/service.go @@ -14,8 +14,8 @@ type EventServiceInterface interface { GetEvents(pageInfo fiberpaginate.PageInfo) ([]models.Event, error) GetEvent(eventID string) (*models.Event, error) // event cud - CreateEvent(body models.CreateEventRequestBody) (*models.Event, error) - UpdateEvent(eventID string, eventBody models.UpdateEventRequestBody) ([]models.Event, error) + CreateEvent(body events.CreateEventRequestBody) (*models.Event, error) + UpdateEvent(eventID string, eventBody events.UpdateEventRequestBody) ([]models.Event, error) DeleteEvent(eventID string) error } @@ -40,7 +40,7 @@ func (e *EventService) GetEvent(eventID string) (*models.Event, error) { return events.GetEvent(e.DB, *idAsUUID) } -func (e *EventService) CreateEvent(body models.CreateEventRequestBody) (*models.Event, error) { +func (e *EventService) CreateEvent(body events.CreateEventRequestBody) (*models.Event, error) { if err := utilities.Validate(e.Validate, body); err != nil { return nil, err } @@ -48,7 +48,7 @@ func (e *EventService) CreateEvent(body models.CreateEventRequestBody) (*models. return CreateEvent(e.DB, *body.Into()) } -func (e *EventService) UpdateEvent(eventID string, eventBody models.UpdateEventRequestBody) ([]models.Event, error) { +func (e *EventService) UpdateEvent(eventID string, eventBody events.UpdateEventRequestBody) ([]models.Event, error) { idAsUUID, err := utilities.ValidateID(eventID) if err != nil { return nil, err diff --git a/backend/entities/events/models.go b/backend/entities/events/models.go new file mode 100644 index 000000000..f0f4c547e --- /dev/null +++ b/backend/entities/events/models.go @@ -0,0 +1,71 @@ +package events + +import ( + "time" + + "github.com/GenerateNU/sac/backend/entities/models" + "github.com/google/uuid" +) + +type CreateEventRequestBody struct { + // details + Name string `json:"name" validate:"required,max=255"` + Preview string `json:"preview" validate:"required,max=255"` + Description string `json:"description" validate:"required,max=255"` + HostID uuid.UUID `json:"host" validate:"uuid4"` + + // geoshi + EventType models.EventType `json:"event_type" validate:"required,max=255,oneof=hybrid in_person virtual"` + Location string `json:"location" validate:"max=255,required_if=EventType in_person,required_if=EventType hybrid"` + Link string `json:"link" validate:"http_url,max=255,required_if=EventType virtual,required_if=EventType hybrid"` + + // internal housekeeping states + IsPublic *bool `json:"is_public" validate:"required"` + IsDraft *bool `json:"is_draft" validate:"required"` + IsArchived *bool `json:"is_archived" validate:"required"` + + // timing + StartTime time.Time `json:"start_time" validate:"required,ltefield=EndTime"` + EndTime time.Time `json:"end_time" validate:"required,gtefield=StartTime"` +} + +func (c *CreateEventRequestBody) Into() *models.Event { + return &models.Event{ + Name: c.Name, + Preview: c.Preview, + Description: c.Description, + Host: &c.HostID, + EventType: c.EventType, + Location: c.Location, + Link: c.Link, + IsPublic: *c.IsPublic, + IsDraft: *c.IsDraft, + IsArchived: *c.IsArchived, + StartTime: c.StartTime, + EndTime: c.EndTime, + } +} + +type UpdateEventRequestBody struct { + // details + Name string `json:"name" validate:"omitempty,max=255"` + Preview string `json:"preview" validate:"omitempty,max=255"` + Description string `json:"description" validate:"omitempty,max=255"` + HostID *uuid.UUID `json:"host" validate:"omitempty,uuid4"` + + // geoshi + EventType models.EventType `json:"event_type" validate:"omitempty,max=255,oneof=hybrid in_person virtual"` + Location string `json:"location" validate:"omitempty,max=255,required_if=EventType in_person,required_if=EventType hybrid"` + Link string `json:"link" validate:"omitempty,url,max=255,required_if=EventType virtual,required_if=EventType hybrid"` + + // internal housekeeping states + IsPublic bool `json:"is_public" validate:"omitempty"` + IsDraft bool `json:"is_draft" validate:"omitempty"` + IsArchived bool `json:"is_archived" validate:"omitempty"` + + // timing + StartTime time.Time `json:"start_time" validate:"omitempty,ltecsfield=EndTime"` + EndTime time.Time `json:"end_time" validate:"omitempty,gtecsfield=StartTime"` + + UpdateAllInSeries *bool `json:"update_all_in_series" validate:"required"` +} diff --git a/backend/entities/events/series/models.go b/backend/entities/events/series/models.go index 71af27eb7..6d98cb4c4 100644 --- a/backend/entities/events/series/models.go +++ b/backend/entities/events/series/models.go @@ -4,13 +4,14 @@ import ( "fmt" "time" + "github.com/GenerateNU/sac/backend/entities/events" "github.com/GenerateNU/sac/backend/entities/models" "github.com/GenerateNU/sac/backend/protos" "github.com/GenerateNU/sac/backend/utilities" ) type CreateEventSeriesRequestBody struct { - models.CreateEventRequestBody + events.CreateEventRequestBody Recurrence protos.StringRecurrence `json:"recurrence" validate:"required"` Termination time.Time `json:"termination" validate:"required"` } @@ -34,7 +35,7 @@ func (c *CreateEventSeriesRequestBody) Validate() (*ValidatedCreateEventSeriesRe } type ValidatedCreateEventSeriesRequestBody struct { - models.CreateEventRequestBody + events.CreateEventRequestBody Recurrence protos.Recurrence `json:"recurrence"` Termination time.Time `json:"termination"` } diff --git a/backend/entities/files/base/controller.go b/backend/entities/files/base/controller.go index 4f713c717..de0efaed3 100644 --- a/backend/entities/files/base/controller.go +++ b/backend/entities/files/base/controller.go @@ -3,7 +3,6 @@ package base import ( "net/http" - "github.com/GenerateNU/sac/backend/entities/models" "github.com/GenerateNU/sac/backend/utilities" "github.com/garrettladley/fiberpaginate" "github.com/gofiber/fiber/v2" @@ -79,7 +78,7 @@ func (f *FileController) GetFile(c *fiber.Ctx) error { // @Tags file // @Accept multipart/form-data // @Produce json -// @Param file body models.CreateFileRequestBody true "File" +// @Param file body CreateFileRequestBody true "File" // @Success 201 {object} models.File // @Failure 400 {object} error // @Failure 401 {object} error @@ -87,7 +86,7 @@ func (f *FileController) GetFile(c *fiber.Ctx) error { // @Failure 500 {object} error // @Router /files/ [post] func (f *FileController) CreateFile(c *fiber.Ctx) error { - var fileBody models.CreateFileRequestBody + var fileBody CreateFileRequestBody if err := c.BodyParser(&fileBody); err != nil { return utilities.InvalidJSON() diff --git a/backend/entities/files/base/models.go b/backend/entities/files/base/models.go new file mode 100644 index 000000000..120959250 --- /dev/null +++ b/backend/entities/files/base/models.go @@ -0,0 +1,8 @@ +package base + +import "github.com/google/uuid" + +type CreateFileRequestBody struct { + OwnerID uuid.UUID `json:"owner_id" validate:"required,uuid4"` + OwnerType string `json:"owner_type" validate:"required,max=255"` +} diff --git a/backend/entities/files/base/service.go b/backend/entities/files/base/service.go index 8df844aa5..b7969201d 100644 --- a/backend/entities/files/base/service.go +++ b/backend/entities/files/base/service.go @@ -13,7 +13,7 @@ import ( type FileServiceInterface interface { GetFiles(pageInfo fiberpaginate.PageInfo) ([]models.File, error) GetFile(fileID string) (*models.File, error) - CreateFile(fileBody *models.CreateFileRequestBody, formFile *multipart.FileHeader) (*models.File, error) + CreateFile(fileBody *CreateFileRequestBody, formFile *multipart.FileHeader) (*models.File, error) DeleteFile(fileID string) error } @@ -38,7 +38,7 @@ func (f *FileService) GetFile(fileID string) (*models.File, error) { return GetFile(f.DB, *idAsUUID) } -func (f *FileService) CreateFile(fileBody *models.CreateFileRequestBody, fileHeader *multipart.FileHeader) (*models.File, error) { +func (f *FileService) CreateFile(fileBody *CreateFileRequestBody, fileHeader *multipart.FileHeader) (*models.File, error) { if err := utilities.Validate(f.Validate, fileBody); err != nil { return nil, err } diff --git a/backend/entities/models/category.go b/backend/entities/models/category.go index 6690df93d..f6aaf3df4 100644 --- a/backend/entities/models/category.go +++ b/backend/entities/models/category.go @@ -6,7 +6,3 @@ type Category struct { Name string `json:"name"` Tag []Tag `json:"-"` } - -type CategoryRequestBody struct { - Name string `json:"name" validate:"required,max=255"` -} diff --git a/backend/entities/models/club.go b/backend/entities/models/club.go index 537ac3746..decfda89b 100644 --- a/backend/entities/models/club.go +++ b/backend/entities/models/club.go @@ -57,37 +57,6 @@ type Club struct { Notifcation []Notification `gorm:"polymorphic:Reference;" json:"-"` } -type CreateClubRequestBody struct { - UserID uuid.UUID `json:"user_id" validate:"required,uuid4"` - Name string `json:"name" validate:"required,max=255"` - Preview string `json:"preview" validate:"required,max=255"` - Description string `json:"description" validate:"required,http_url,s3_url,max=255"` - IsRecruiting bool `json:"is_recruiting" validate:"required"` - RecruitmentCycle RecruitmentCycle `json:"recruitment_cycle" validate:"required,max=255,oneof=fall spring fallSpring always"` - RecruitmentType RecruitmentType `json:"recruitment_type" validate:"required,max=255,oneof=unrestricted tryout application"` - WeeklyTimeCommitment *int `json:"weekly_time_commitment" validate:"omitempty,min=1"` - OneWordToDescribeUs string `json:"one_word_to_describe_us" validate:"omitempty,max=255"` - ApplicationLink string `json:"application_link" validate:"required,max=255,http_url"` - Logo string `json:"logo" validate:"omitempty,http_url,s3_url,max=255"` -} - -type UpdateClubRequestBody struct { - Name string `json:"name" validate:"omitempty,max=255"` - Preview string `json:"preview" validate:"omitempty,max=255"` - Description string `json:"description" validate:"omitempty,http_url,s3_url,max=255"` - IsRecruiting bool `json:"is_recruiting" validate:"omitempty"` - RecruitmentCycle RecruitmentCycle `json:"recruitment_cycle" validate:"required,max=255,oneof=fall spring fallSpring always"` - RecruitmentType RecruitmentType `json:"recruitment_type" validate:"required,max=255,oneof=unrestricted tryout application"` - WeeklyTimeCommitment *int `json:"weekly_time_commitment" validate:"omitempty,min=1"` - OneWordToDescribeUs string `json:"one_word_to_describe_us" validate:"omitempty,max=255"` - ApplicationLink string `json:"application_link" validate:"omitempty,required,max=255,http_url"` - Logo string `json:"logo" validate:"omitempty,s3_url,max=255,http_url"` -} - -type CreateClubTagsRequestBody struct { - Tags []uuid.UUID `json:"tags" validate:"required"` -} - type ClubQueryParams struct { Tags []string `query:"tags"` MinMembers int `query:"min_members"` diff --git a/backend/entities/models/contact.go b/backend/entities/models/contact.go index 8b17d95fc..82b3de1d3 100644 --- a/backend/entities/models/contact.go +++ b/backend/entities/models/contact.go @@ -48,8 +48,3 @@ type Contact struct { ClubID uuid.UUID `json:"-"` } - -type PutContactRequestBody struct { - Type ContactType `json:"type" validate:"required,max=255,oneof=facebook instagram x linkedin youtube github slack discord email customSite,contact_pointer"` - Content string `json:"content" validate:"required,contact_pointer,max=255"` -} diff --git a/backend/entities/models/event.go b/backend/entities/models/event.go index 41a58af35..12eb1b0f6 100644 --- a/backend/entities/models/event.go +++ b/backend/entities/models/event.go @@ -47,66 +47,3 @@ type Event struct { Tag []Tag `gorm:"many2many:event_tags;" json:"-"` Notification []Notification `gorm:"polymorphic:Reference;" json:"-"` } - -type CreateEventRequestBody struct { - // details - Name string `json:"name" validate:"required,max=255"` - Preview string `json:"preview" validate:"required,max=255"` - Description string `json:"description" validate:"required,max=255"` - HostID uuid.UUID `json:"host" validate:"uuid4"` - - // geoshi - EventType EventType `json:"event_type" validate:"required,max=255,oneof=hybrid in_person virtual"` - Location string `json:"location" validate:"max=255,required_if=EventType in_person,required_if=EventType hybrid"` - Link string `json:"link" validate:"http_url,max=255,required_if=EventType virtual,required_if=EventType hybrid"` - - // internal housekeeping states - IsPublic *bool `json:"is_public" validate:"required"` - IsDraft *bool `json:"is_draft" validate:"required"` - IsArchived *bool `json:"is_archived" validate:"required"` - - // timing - StartTime time.Time `json:"start_time" validate:"required,ltefield=EndTime"` - EndTime time.Time `json:"end_time" validate:"required,gtefield=StartTime"` -} - -func (c *CreateEventRequestBody) Into() *Event { - return &Event{ - Name: c.Name, - Preview: c.Preview, - Description: c.Description, - Host: &c.HostID, - EventType: c.EventType, - Location: c.Location, - Link: c.Link, - IsPublic: *c.IsPublic, - IsDraft: *c.IsDraft, - IsArchived: *c.IsArchived, - StartTime: c.StartTime, - EndTime: c.EndTime, - } -} - -type UpdateEventRequestBody struct { - // details - Name string `json:"name" validate:"omitempty,max=255"` - Preview string `json:"preview" validate:"omitempty,max=255"` - Description string `json:"description" validate:"omitempty,max=255"` - HostID *uuid.UUID `json:"host" validate:"omitempty,uuid4"` - - // geoshi - EventType EventType `json:"event_type" validate:"omitempty,max=255,oneof=hybrid in_person virtual"` - Location string `json:"location" validate:"omitempty,max=255,required_if=EventType in_person,required_if=EventType hybrid"` - Link string `json:"link" validate:"omitempty,url,max=255,required_if=EventType virtual,required_if=EventType hybrid"` - - // internal housekeeping states - IsPublic bool `json:"is_public" validate:"omitempty"` - IsDraft bool `json:"is_draft" validate:"omitempty"` - IsArchived bool `json:"is_archived" validate:"omitempty"` - - // timing - StartTime time.Time `json:"start_time" validate:"omitempty,ltecsfield=EndTime"` - EndTime time.Time `json:"end_time" validate:"omitempty,gtecsfield=StartTime"` - - UpdateAllInSeries *bool `json:"update_all_in_series" validate:"required"` -} diff --git a/backend/entities/models/file.go b/backend/entities/models/file.go index 6f5ca95e8..215618a6a 100644 --- a/backend/entities/models/file.go +++ b/backend/entities/models/file.go @@ -24,8 +24,3 @@ type File struct { FileURL string `json:"file_url"` ObjectKey string `json:"object_key"` } - -type CreateFileRequestBody struct { - OwnerID uuid.UUID `json:"owner_id" validate:"required,uuid4"` - OwnerType string `json:"owner_type" validate:"required,max=255"` -} diff --git a/backend/entities/models/poc.go b/backend/entities/models/poc.go index 732cdb01e..9a94b45dd 100644 --- a/backend/entities/models/poc.go +++ b/backend/entities/models/poc.go @@ -15,15 +15,3 @@ type PointOfContact struct { PhotoFile File `gorm:"polymorphic:Owner;" json:"photo_file"` } - -type CreatePointOfContactBody struct { - Name string `json:"name" validate:"required,max=255"` - Email string `json:"email" validate:"required,email,max=255"` - Position string `json:"position" validate:"required,max=255"` -} - -type UpdatePointOfContactBody struct { - Name string `json:"name" validate:"omitempty,max=255"` - Email string `json:"email" validate:"omitempty,email,max=255"` - Position string `json:"position" validate:"omitempty,max=255"` -} diff --git a/backend/entities/models/tag.go b/backend/entities/models/tag.go index 4d9f15fa2..ec3235e41 100644 --- a/backend/entities/models/tag.go +++ b/backend/entities/models/tag.go @@ -13,13 +13,3 @@ type Tag struct { Club []Club `gorm:"many2many:club_tags;" json:"-"` Event []Event `gorm:"many2many:event_tags;" json:"-"` } - -type CreateTagRequestBody struct { - Name string `json:"name" validate:"required,max=255"` - CategoryID uuid.UUID `json:"category_id" validate:"required,uuid4"` -} - -type UpdateTagRequestBody struct { - Name string `json:"name" validate:"omitempty,max=255"` - CategoryID uuid.UUID `json:"category_id" validate:"omitempty,uuid4"` -} diff --git a/backend/entities/models/user.go b/backend/entities/models/user.go index 7eb414e19..4c2d409fe 100644 --- a/backend/entities/models/user.go +++ b/backend/entities/models/user.go @@ -170,45 +170,6 @@ type User struct { Waitlist []Event `gorm:"many2many:user_event_waitlists;" json:"-"` } -type CreateUserRequestBody struct { - FirstName string `json:"first_name" validate:"required,max=255"` - LastName string `json:"last_name" validate:"required,max=255"` - Email string `json:"email" validate:"required,email,neu_email,max=255"` - Password string `json:"password" validate:"required,max=255"` // MARK: must be validated manually - // Optional fields - Major0 Major `json:"major0" validate:"not_equal_if_not_empty=Major1,not_equal_if_not_empty=Major2,omitempty,max=255,oneof=africanaStudies americanSignLanguage americanSignLanguage-EnglishInterpreting appliedPhysics architecturalStudies architecture art:ArtVisualStudies behavioralNeuroscience biochemistry bioengineering biology biomedicalPhysics businessAdministration businessAdministration:Accounting businessAdministration:AccountingAndAdvisoryServices businessAdministration:BrandManagement businessAdministration:BusinessAnalytics businessAdministration:CorporateInnovation businessAdministration:EntrepreneurialStartups businessAdministration:FamilyBusiness businessAdministration:Finance businessAdministration:Fintech businessAdministration:HealthcareManagementAndConsulting businessAdministration:Management businessAdministration:ManagementInformationSystems businessAdministration:Marketing businessAdministration:MarketingAnalytics businessAdministration:SocialInnovationAndEntrepreneurship businessAdministration:SupplyChainManagement cellAndMolecularBiology chemicalEngineering chemistry civilEngineering communicationStudies computerEngineering computerScience computingAndLaw criminologyAndCriminalJustice culturalAnthropology cybersecurity dataScience design economics electricalEngineering english environmentalAndSustainabilityStudies environmentalEngineering environmentalScience environmentalStudies gameArtAndAnimation gameDesign globalAsianStudies healthScience history historyCultureAndLaw humanServices industrialEngineering internationalAffairs internationalBusiness internationalBusiness:Accounting internationalBusiness:AccountingAndAdvisoryServices internationalBusiness:BrandManagement internationalBusiness:BusinessAnalytics internationalBusiness:CorporateInnovation internationalBusiness:EntrepreneurialStartups internationalBusiness:FamilyBusiness internationalBusiness:Finance internationalBusiness:Fintech internationalBusiness:HealthcareManagementAndConsulting internationalBusiness:Management internationalBusiness:ManagementInformationSystems internationalBusiness:Marketing internationalBusiness:MarketingAnalytics internationalBusiness:SocialInnovationAndEntrepreneurship internationalBusiness:SupplyChainManagement journalism landscapeArchitecture linguistics marineBiology mathematics mechanicalEngineering mediaAndScreenStudies mediaArts music musicTechnology nursing pharmaceuticalSciences pharmacy(PharmD) philosophy physics politicalScience politicsPhilosophyEconomics psychology publicHealth publicRelations religiousStudies sociology spanish speechLanguagePathologyAndAudiology theatre"` - Major1 Major `json:"major1" validate:"not_equal_if_not_empty=Major0,not_equal_if_not_empty=Major2,omitempty,max=255,oneof=africanaStudies americanSignLanguage americanSignLanguage-EnglishInterpreting appliedPhysics architecturalStudies architecture art:ArtVisualStudies behavioralNeuroscience biochemistry bioengineering biology biomedicalPhysics businessAdministration businessAdministration:Accounting businessAdministration:AccountingAndAdvisoryServices businessAdministration:BrandManagement businessAdministration:BusinessAnalytics businessAdministration:CorporateInnovation businessAdministration:EntrepreneurialStartups businessAdministration:FamilyBusiness businessAdministration:Finance businessAdministration:Fintech businessAdministration:HealthcareManagementAndConsulting businessAdministration:Management businessAdministration:ManagementInformationSystems businessAdministration:Marketing businessAdministration:MarketingAnalytics businessAdministration:SocialInnovationAndEntrepreneurship businessAdministration:SupplyChainManagement cellAndMolecularBiology chemicalEngineering chemistry civilEngineering communicationStudies computerEngineering computerScience computingAndLaw criminologyAndCriminalJustice culturalAnthropology cybersecurity dataScience design economics electricalEngineering english environmentalAndSustainabilityStudies environmentalEngineering environmentalScience environmentalStudies gameArtAndAnimation gameDesign globalAsianStudies healthScience history historyCultureAndLaw humanServices industrialEngineering internationalAffairs internationalBusiness internationalBusiness:Accounting internationalBusiness:AccountingAndAdvisoryServices internationalBusiness:BrandManagement internationalBusiness:BusinessAnalytics internationalBusiness:CorporateInnovation internationalBusiness:EntrepreneurialStartups internationalBusiness:FamilyBusiness internationalBusiness:Finance internationalBusiness:Fintech internationalBusiness:HealthcareManagementAndConsulting internationalBusiness:Management internationalBusiness:ManagementInformationSystems internationalBusiness:Marketing internationalBusiness:MarketingAnalytics internationalBusiness:SocialInnovationAndEntrepreneurship internationalBusiness:SupplyChainManagement journalism landscapeArchitecture linguistics marineBiology mathematics mechanicalEngineering mediaAndScreenStudies mediaArts music musicTechnology nursing pharmaceuticalSciences pharmacy(PharmD) philosophy physics politicalScience politicsPhilosophyEconomics psychology publicHealth publicRelations religiousStudies sociology spanish speechLanguagePathologyAndAudiology theatre"` - Major2 Major `json:"major2" validate:"not_equal_if_not_empty=Major0,not_equal_if_not_empty=Major1,omitempty,max=255,oneof=africanaStudies americanSignLanguage americanSignLanguage-EnglishInterpreting appliedPhysics architecturalStudies architecture art:ArtVisualStudies behavioralNeuroscience biochemistry bioengineering biology biomedicalPhysics businessAdministration businessAdministration:Accounting businessAdministration:AccountingAndAdvisoryServices businessAdministration:BrandManagement businessAdministration:BusinessAnalytics businessAdministration:CorporateInnovation businessAdministration:EntrepreneurialStartups businessAdministration:FamilyBusiness businessAdministration:Finance businessAdministration:Fintech businessAdministration:HealthcareManagementAndConsulting businessAdministration:Management businessAdministration:ManagementInformationSystems businessAdministration:Marketing businessAdministration:MarketingAnalytics businessAdministration:SocialInnovationAndEntrepreneurship businessAdministration:SupplyChainManagement cellAndMolecularBiology chemicalEngineering chemistry civilEngineering communicationStudies computerEngineering computerScience computingAndLaw criminologyAndCriminalJustice culturalAnthropology cybersecurity dataScience design economics electricalEngineering english environmentalAndSustainabilityStudies environmentalEngineering environmentalScience environmentalStudies gameArtAndAnimation gameDesign globalAsianStudies healthScience history historyCultureAndLaw humanServices industrialEngineering internationalAffairs internationalBusiness internationalBusiness:Accounting internationalBusiness:AccountingAndAdvisoryServices internationalBusiness:BrandManagement internationalBusiness:BusinessAnalytics internationalBusiness:CorporateInnovation internationalBusiness:EntrepreneurialStartups internationalBusiness:FamilyBusiness internationalBusiness:Finance internationalBusiness:Fintech internationalBusiness:HealthcareManagementAndConsulting internationalBusiness:Management internationalBusiness:ManagementInformationSystems internationalBusiness:Marketing internationalBusiness:MarketingAnalytics internationalBusiness:SocialInnovationAndEntrepreneurship internationalBusiness:SupplyChainManagement journalism landscapeArchitecture linguistics marineBiology mathematics mechanicalEngineering mediaAndScreenStudies mediaArts music musicTechnology nursing pharmaceuticalSciences pharmacy(PharmD) philosophy physics politicalScience politicsPhilosophyEconomics psychology publicHealth publicRelations religiousStudies sociology spanish speechLanguagePathologyAndAudiology theatre"` - College College `json:"college" validate:"omitempty,oneof=CAMD DMSB KCCS CE BCHS SL CPS CS CSSH"` - GraduationCycle GraduationCycle `json:"graduation_cycle" validate:"omitempty,max=255,oneof=december may"` - GraduationYear int16 `json:"graduation_year" validate:"omitempty"` -} - -type UpdateUserRequestBody struct { - FirstName string `json:"first_name" validate:"omitempty,max=255"` - LastName string `json:"last_name" validate:"omitempty,max=255"` - Major0 Major `json:"major0" validate:"not_equal_if_not_empty=Major1,not_equal_if_not_empty=Major2,omitempty,max=255,oneof=africanaStudies americanSignLanguage americanSignLanguage-EnglishInterpreting appliedPhysics architecturalStudies architecture art:ArtVisualStudies behavioralNeuroscience biochemistry bioengineering biology biomedicalPhysics businessAdministration businessAdministration:Accounting businessAdministration:AccountingAndAdvisoryServices businessAdministration:BrandManagement businessAdministration:BusinessAnalytics businessAdministration:CorporateInnovation businessAdministration:EntrepreneurialStartups businessAdministration:FamilyBusiness businessAdministration:Finance businessAdministration:Fintech businessAdministration:HealthcareManagementAndConsulting businessAdministration:Management businessAdministration:ManagementInformationSystems businessAdministration:Marketing businessAdministration:MarketingAnalytics businessAdministration:SocialInnovationAndEntrepreneurship businessAdministration:SupplyChainManagement cellAndMolecularBiology chemicalEngineering chemistry civilEngineering communicationStudies computerEngineering computerScience computingAndLaw criminologyAndCriminalJustice culturalAnthropology cybersecurity dataScience design economics electricalEngineering english environmentalAndSustainabilityStudies environmentalEngineering environmentalScience environmentalStudies gameArtAndAnimation gameDesign globalAsianStudies healthScience history historyCultureAndLaw humanServices industrialEngineering internationalAffairs internationalBusiness internationalBusiness:Accounting internationalBusiness:AccountingAndAdvisoryServices internationalBusiness:BrandManagement internationalBusiness:BusinessAnalytics internationalBusiness:CorporateInnovation internationalBusiness:EntrepreneurialStartups internationalBusiness:FamilyBusiness internationalBusiness:Finance internationalBusiness:Fintech internationalBusiness:HealthcareManagementAndConsulting internationalBusiness:Management internationalBusiness:ManagementInformationSystems internationalBusiness:Marketing internationalBusiness:MarketingAnalytics internationalBusiness:SocialInnovationAndEntrepreneurship internationalBusiness:SupplyChainManagement journalism landscapeArchitecture linguistics marineBiology mathematics mechanicalEngineering mediaAndScreenStudies mediaArts music musicTechnology nursing pharmaceuticalSciences pharmacy(PharmD) philosophy physics politicalScience politicsPhilosophyEconomics psychology publicHealth publicRelations religiousStudies sociology spanish speechLanguagePathologyAndAudiology theatre"` - Major1 Major `json:"major1" validate:"not_equal_if_not_empty=Major0,not_equal_if_not_empty=Major2,omitempty,max=255,oneof=africanaStudies americanSignLanguage americanSignLanguage-EnglishInterpreting appliedPhysics architecturalStudies architecture art:ArtVisualStudies behavioralNeuroscience biochemistry bioengineering biology biomedicalPhysics businessAdministration businessAdministration:Accounting businessAdministration:AccountingAndAdvisoryServices businessAdministration:BrandManagement businessAdministration:BusinessAnalytics businessAdministration:CorporateInnovation businessAdministration:EntrepreneurialStartups businessAdministration:FamilyBusiness businessAdministration:Finance businessAdministration:Fintech businessAdministration:HealthcareManagementAndConsulting businessAdministration:Management businessAdministration:ManagementInformationSystems businessAdministration:Marketing businessAdministration:MarketingAnalytics businessAdministration:SocialInnovationAndEntrepreneurship businessAdministration:SupplyChainManagement cellAndMolecularBiology chemicalEngineering chemistry civilEngineering communicationStudies computerEngineering computerScience computingAndLaw criminologyAndCriminalJustice culturalAnthropology cybersecurity dataScience design economics electricalEngineering english environmentalAndSustainabilityStudies environmentalEngineering environmentalScience environmentalStudies gameArtAndAnimation gameDesign globalAsianStudies healthScience history historyCultureAndLaw humanServices industrialEngineering internationalAffairs internationalBusiness internationalBusiness:Accounting internationalBusiness:AccountingAndAdvisoryServices internationalBusiness:BrandManagement internationalBusiness:BusinessAnalytics internationalBusiness:CorporateInnovation internationalBusiness:EntrepreneurialStartups internationalBusiness:FamilyBusiness internationalBusiness:Finance internationalBusiness:Fintech internationalBusiness:HealthcareManagementAndConsulting internationalBusiness:Management internationalBusiness:ManagementInformationSystems internationalBusiness:Marketing internationalBusiness:MarketingAnalytics internationalBusiness:SocialInnovationAndEntrepreneurship internationalBusiness:SupplyChainManagement journalism landscapeArchitecture linguistics marineBiology mathematics mechanicalEngineering mediaAndScreenStudies mediaArts music musicTechnology nursing pharmaceuticalSciences pharmacy(PharmD) philosophy physics politicalScience politicsPhilosophyEconomics psychology publicHealth publicRelations religiousStudies sociology spanish speechLanguagePathologyAndAudiology theatre"` - Major2 Major `json:"major2" validate:"not_equal_if_not_empty=Major0,not_equal_if_not_empty=Major1,omitempty,max=255,oneof=africanaStudies americanSignLanguage americanSignLanguage-EnglishInterpreting appliedPhysics architecturalStudies architecture art:ArtVisualStudies behavioralNeuroscience biochemistry bioengineering biology biomedicalPhysics businessAdministration businessAdministration:Accounting businessAdministration:AccountingAndAdvisoryServices businessAdministration:BrandManagement businessAdministration:BusinessAnalytics businessAdministration:CorporateInnovation businessAdministration:EntrepreneurialStartups businessAdministration:FamilyBusiness businessAdministration:Finance businessAdministration:Fintech businessAdministration:HealthcareManagementAndConsulting businessAdministration:Management businessAdministration:ManagementInformationSystems businessAdministration:Marketing businessAdministration:MarketingAnalytics businessAdministration:SocialInnovationAndEntrepreneurship businessAdministration:SupplyChainManagement cellAndMolecularBiology chemicalEngineering chemistry civilEngineering communicationStudies computerEngineering computerScience computingAndLaw criminologyAndCriminalJustice culturalAnthropology cybersecurity dataScience design economics electricalEngineering english environmentalAndSustainabilityStudies environmentalEngineering environmentalScience environmentalStudies gameArtAndAnimation gameDesign globalAsianStudies healthScience history historyCultureAndLaw humanServices industrialEngineering internationalAffairs internationalBusiness internationalBusiness:Accounting internationalBusiness:AccountingAndAdvisoryServices internationalBusiness:BrandManagement internationalBusiness:BusinessAnalytics internationalBusiness:CorporateInnovation internationalBusiness:EntrepreneurialStartups internationalBusiness:FamilyBusiness internationalBusiness:Finance internationalBusiness:Fintech internationalBusiness:HealthcareManagementAndConsulting internationalBusiness:Management internationalBusiness:ManagementInformationSystems internationalBusiness:Marketing internationalBusiness:MarketingAnalytics internationalBusiness:SocialInnovationAndEntrepreneurship internationalBusiness:SupplyChainManagement journalism landscapeArchitecture linguistics marineBiology mathematics mechanicalEngineering mediaAndScreenStudies mediaArts music musicTechnology nursing pharmaceuticalSciences pharmacy(PharmD) philosophy physics politicalScience politicsPhilosophyEconomics psychology publicHealth publicRelations religiousStudies sociology spanish speechLanguagePathologyAndAudiology theatre"` - College College `json:"college" validate:"omitempty,oneof=CAMD DMSB KCCS CE BCHS SL CPS CS CSSH"` - GraduationCycle GraduationCycle `json:"graduation_cycle" validate:"omitempty,max=255,oneof=december may"` - GraduationYear int16 `json:"graduation_year" validate:"omitempty"` -} - -type LoginUserResponseBody struct { - Email string `json:"email" validate:"required,email"` - Password string `json:"password" validate:"required,max=255"` // MARK: must be validated manually -} - -type UpdatePasswordRequestBody struct { - OldPassword string `json:"old_password" validate:"required,max=255"` // MARK: must be validated manually - NewPassword string `json:"new_password" validate:"required,not_equal_if_not_empty=OldPassword,max=255"` // MARK: must be validated manually -} - -type RefreshTokenRequestBody struct { - RefreshToken string `json:"refresh_token" validate:"required"` -} - func (u *User) AfterCreate(tx *gorm.DB) (err error) { sac := &Club{} if err := tx.Where("name = ?", "SAC").First(sac).Error; err != nil { diff --git a/backend/entities/tags/base/controller.go b/backend/entities/tags/base/controller.go index 0d2fb1aff..29d63572c 100644 --- a/backend/entities/tags/base/controller.go +++ b/backend/entities/tags/base/controller.go @@ -3,7 +3,6 @@ package base import ( "net/http" - "github.com/GenerateNU/sac/backend/entities/models" "github.com/GenerateNU/sac/backend/utilities" "github.com/gofiber/fiber/v2" @@ -48,7 +47,7 @@ func (t *TagController) GetTags(c *fiber.Ctx) error { // @Tags tag // @Accept json // @Produce json -// @Param tagBody body models.CreateTagRequestBody true "Tag Body" +// @Param tagBody body CreateTagRequestBody true "Tag Body" // @Success 201 {object} models.Tag // @Failure 400 {object} error // @Failure 401 {object} error @@ -56,7 +55,7 @@ func (t *TagController) GetTags(c *fiber.Ctx) error { // @Failure 500 {object} error // @Router /tags/ [post] func (t *TagController) CreateTag(c *fiber.Ctx) error { - var tagBody models.CreateTagRequestBody + var tagBody CreateTagRequestBody if err := c.BodyParser(&tagBody); err != nil { return utilities.InvalidJSON() @@ -101,7 +100,7 @@ func (t *TagController) GetTag(c *fiber.Ctx) error { // @Accept json // @Produce json // @Param tagID path string true "Tag ID" -// @Param tag body models.UpdateTagRequestBody true "Tag" +// @Param tag body UpdateTagRequestBody true "Tag" // @Success 200 {object} models.Tag // @Failure 400 {object} error // @Failure 401 {object} error @@ -109,7 +108,7 @@ func (t *TagController) GetTag(c *fiber.Ctx) error { // @Failure 500 {object} error // @Router /tags/{tagID}/ [patch] func (t *TagController) UpdateTag(c *fiber.Ctx) error { - var tagBody models.UpdateTagRequestBody + var tagBody UpdateTagRequestBody if err := c.BodyParser(&tagBody); err != nil { return utilities.InvalidJSON() diff --git a/backend/entities/tags/base/models.go b/backend/entities/tags/base/models.go new file mode 100644 index 000000000..ced3bd807 --- /dev/null +++ b/backend/entities/tags/base/models.go @@ -0,0 +1,13 @@ +package base + +import "github.com/google/uuid" + +type CreateTagRequestBody struct { + Name string `json:"name" validate:"required,max=255"` + CategoryID uuid.UUID `json:"category_id" validate:"required,uuid4"` +} + +type UpdateTagRequestBody struct { + Name string `json:"name" validate:"omitempty,max=255"` + CategoryID uuid.UUID `json:"category_id" validate:"omitempty,uuid4"` +} diff --git a/backend/entities/tags/base/service.go b/backend/entities/tags/base/service.go index 3dd4f238c..6c11a40d6 100644 --- a/backend/entities/tags/base/service.go +++ b/backend/entities/tags/base/service.go @@ -12,9 +12,9 @@ import ( type TagServiceInterface interface { GetTags() ([]models.Tag, error) - CreateTag(tagBody models.CreateTagRequestBody) (*models.Tag, error) + CreateTag(tagBody CreateTagRequestBody) (*models.Tag, error) GetTag(id string) (*models.Tag, error) - UpdateTag(id string, tagBody models.UpdateTagRequestBody) (*models.Tag, error) + UpdateTag(id string, tagBody UpdateTagRequestBody) (*models.Tag, error) DeleteTag(id string) error } @@ -26,7 +26,7 @@ func NewTagService(serviceParams types.ServiceParams) TagServiceInterface { return &TagService{serviceParams} } -func (t *TagService) CreateTag(tagBody models.CreateTagRequestBody) (*models.Tag, error) { +func (t *TagService) CreateTag(tagBody CreateTagRequestBody) (*models.Tag, error) { if err := utilities.Validate(t.Validate, tagBody); err != nil { return nil, err } @@ -52,13 +52,13 @@ func (t *TagService) GetTag(tagID string) (*models.Tag, error) { return tags.GetTag(t.DB, *tagIDAsUUID) } -func (t *TagService) UpdateTag(tagID string, tagBody models.UpdateTagRequestBody) (*models.Tag, error) { +func (t *TagService) UpdateTag(tagID string, tagBody UpdateTagRequestBody) (*models.Tag, error) { tagIDAsUUID, err := utilities.ValidateID(tagID) if err != nil { return nil, err } - if utilities.AtLeastOne(tagBody, models.UpdateTagRequestBody{}) { + if utilities.AtLeastOne(tagBody, UpdateTagRequestBody{}) { return nil, errors.New("at least one field must be present") } diff --git a/backend/entities/users/base/controller.go b/backend/entities/users/base/controller.go index da92dcec7..2a158273c 100644 --- a/backend/entities/users/base/controller.go +++ b/backend/entities/users/base/controller.go @@ -4,7 +4,7 @@ import ( "net/http" "github.com/GenerateNU/sac/backend/auth" - "github.com/GenerateNU/sac/backend/entities/models" + authEntities "github.com/GenerateNU/sac/backend/entities/auth" "github.com/GenerateNU/sac/backend/utilities" "github.com/garrettladley/fiberpaginate" @@ -108,7 +108,7 @@ func (u *UserController) GetUser(c *fiber.Ctx) error { // @Accept json // @Produce json // @Param userID path string true "User ID" -// @Param userBody body models.UpdateUserRequestBody true "User Body" +// @Param userBody body UpdateUserRequestBody true "User Body" // @Success 200 {object} models.User // @Failure 400 {object} error // @Failure 401 {object} error @@ -116,7 +116,7 @@ func (u *UserController) GetUser(c *fiber.Ctx) error { // @Failure 500 {object} error // @Router /users/{userID}/ [patch] func (u *UserController) UpdateUser(c *fiber.Ctx) error { - var user models.UpdateUserRequestBody + var user UpdateUserRequestBody if err := c.BodyParser(&user); err != nil { return utilities.InvalidJSON() @@ -139,7 +139,7 @@ func (u *UserController) UpdateUser(c *fiber.Ctx) error { // @Accept json // @Produce json // @Param userID path string true "User ID" -// @Param passwordBody body models.UpdatePasswordRequestBody true "Password Body" +// @Param passwordBody body authEntities.UpdatePasswordRequestBody true "Password Body" // @Success 200 {string} utilities.SuccessResponse // @Failure 400 {object} error // @Failure 401 {object} error @@ -147,7 +147,7 @@ func (u *UserController) UpdateUser(c *fiber.Ctx) error { // @Failure 500 {object} error // @Router /users/{userID}/password [patch] func (u *UserController) UpdatePassword(c *fiber.Ctx) error { - var passwordBody models.UpdatePasswordRequestBody + var passwordBody authEntities.UpdatePasswordRequestBody if err := c.BodyParser(&passwordBody); err != nil { return utilities.InvalidJSON() diff --git a/backend/entities/users/base/models.go b/backend/entities/users/base/models.go new file mode 100644 index 000000000..d145e8993 --- /dev/null +++ b/backend/entities/users/base/models.go @@ -0,0 +1,28 @@ +package base + +import "github.com/GenerateNU/sac/backend/entities/models" + +type CreateUserRequestBody struct { + FirstName string `json:"first_name" validate:"required,max=255"` + LastName string `json:"last_name" validate:"required,max=255"` + Email string `json:"email" validate:"required,email,neu_email,max=255"` + Password string `json:"password" validate:"required,max=255"` // MARK: must be validated manually + // Optional fields + Major0 models.Major `json:"major0" validate:"not_equal_if_not_empty=Major1,not_equal_if_not_empty=Major2,omitempty,max=255,oneof=africanaStudies americanSignLanguage americanSignLanguage-EnglishInterpreting appliedPhysics architecturalStudies architecture art:ArtVisualStudies behavioralNeuroscience biochemistry bioengineering biology biomedicalPhysics businessAdministration businessAdministration:Accounting businessAdministration:AccountingAndAdvisoryServices businessAdministration:BrandManagement businessAdministration:BusinessAnalytics businessAdministration:CorporateInnovation businessAdministration:EntrepreneurialStartups businessAdministration:FamilyBusiness businessAdministration:Finance businessAdministration:Fintech businessAdministration:HealthcareManagementAndConsulting businessAdministration:Management businessAdministration:ManagementInformationSystems businessAdministration:Marketing businessAdministration:MarketingAnalytics businessAdministration:SocialInnovationAndEntrepreneurship businessAdministration:SupplyChainManagement cellAndMolecularBiology chemicalEngineering chemistry civilEngineering communicationStudies computerEngineering computerScience computingAndLaw criminologyAndCriminalJustice culturalAnthropology cybersecurity dataScience design economics electricalEngineering english environmentalAndSustainabilityStudies environmentalEngineering environmentalScience environmentalStudies gameArtAndAnimation gameDesign globalAsianStudies healthScience history historyCultureAndLaw humanServices industrialEngineering internationalAffairs internationalBusiness internationalBusiness:Accounting internationalBusiness:AccountingAndAdvisoryServices internationalBusiness:BrandManagement internationalBusiness:BusinessAnalytics internationalBusiness:CorporateInnovation internationalBusiness:EntrepreneurialStartups internationalBusiness:FamilyBusiness internationalBusiness:Finance internationalBusiness:Fintech internationalBusiness:HealthcareManagementAndConsulting internationalBusiness:Management internationalBusiness:ManagementInformationSystems internationalBusiness:Marketing internationalBusiness:MarketingAnalytics internationalBusiness:SocialInnovationAndEntrepreneurship internationalBusiness:SupplyChainManagement journalism landscapeArchitecture linguistics marineBiology mathematics mechanicalEngineering mediaAndScreenStudies mediaArts music musicTechnology nursing pharmaceuticalSciences pharmacy(PharmD) philosophy physics politicalScience politicsPhilosophyEconomics psychology publicHealth publicRelations religiousStudies sociology spanish speechLanguagePathologyAndAudiology theatre"` + Major1 models.Major `json:"major1" validate:"not_equal_if_not_empty=Major0,not_equal_if_not_empty=Major2,omitempty,max=255,oneof=africanaStudies americanSignLanguage americanSignLanguage-EnglishInterpreting appliedPhysics architecturalStudies architecture art:ArtVisualStudies behavioralNeuroscience biochemistry bioengineering biology biomedicalPhysics businessAdministration businessAdministration:Accounting businessAdministration:AccountingAndAdvisoryServices businessAdministration:BrandManagement businessAdministration:BusinessAnalytics businessAdministration:CorporateInnovation businessAdministration:EntrepreneurialStartups businessAdministration:FamilyBusiness businessAdministration:Finance businessAdministration:Fintech businessAdministration:HealthcareManagementAndConsulting businessAdministration:Management businessAdministration:ManagementInformationSystems businessAdministration:Marketing businessAdministration:MarketingAnalytics businessAdministration:SocialInnovationAndEntrepreneurship businessAdministration:SupplyChainManagement cellAndMolecularBiology chemicalEngineering chemistry civilEngineering communicationStudies computerEngineering computerScience computingAndLaw criminologyAndCriminalJustice culturalAnthropology cybersecurity dataScience design economics electricalEngineering english environmentalAndSustainabilityStudies environmentalEngineering environmentalScience environmentalStudies gameArtAndAnimation gameDesign globalAsianStudies healthScience history historyCultureAndLaw humanServices industrialEngineering internationalAffairs internationalBusiness internationalBusiness:Accounting internationalBusiness:AccountingAndAdvisoryServices internationalBusiness:BrandManagement internationalBusiness:BusinessAnalytics internationalBusiness:CorporateInnovation internationalBusiness:EntrepreneurialStartups internationalBusiness:FamilyBusiness internationalBusiness:Finance internationalBusiness:Fintech internationalBusiness:HealthcareManagementAndConsulting internationalBusiness:Management internationalBusiness:ManagementInformationSystems internationalBusiness:Marketing internationalBusiness:MarketingAnalytics internationalBusiness:SocialInnovationAndEntrepreneurship internationalBusiness:SupplyChainManagement journalism landscapeArchitecture linguistics marineBiology mathematics mechanicalEngineering mediaAndScreenStudies mediaArts music musicTechnology nursing pharmaceuticalSciences pharmacy(PharmD) philosophy physics politicalScience politicsPhilosophyEconomics psychology publicHealth publicRelations religiousStudies sociology spanish speechLanguagePathologyAndAudiology theatre"` + Major2 models.Major `json:"major2" validate:"not_equal_if_not_empty=Major0,not_equal_if_not_empty=Major1,omitempty,max=255,oneof=africanaStudies americanSignLanguage americanSignLanguage-EnglishInterpreting appliedPhysics architecturalStudies architecture art:ArtVisualStudies behavioralNeuroscience biochemistry bioengineering biology biomedicalPhysics businessAdministration businessAdministration:Accounting businessAdministration:AccountingAndAdvisoryServices businessAdministration:BrandManagement businessAdministration:BusinessAnalytics businessAdministration:CorporateInnovation businessAdministration:EntrepreneurialStartups businessAdministration:FamilyBusiness businessAdministration:Finance businessAdministration:Fintech businessAdministration:HealthcareManagementAndConsulting businessAdministration:Management businessAdministration:ManagementInformationSystems businessAdministration:Marketing businessAdministration:MarketingAnalytics businessAdministration:SocialInnovationAndEntrepreneurship businessAdministration:SupplyChainManagement cellAndMolecularBiology chemicalEngineering chemistry civilEngineering communicationStudies computerEngineering computerScience computingAndLaw criminologyAndCriminalJustice culturalAnthropology cybersecurity dataScience design economics electricalEngineering english environmentalAndSustainabilityStudies environmentalEngineering environmentalScience environmentalStudies gameArtAndAnimation gameDesign globalAsianStudies healthScience history historyCultureAndLaw humanServices industrialEngineering internationalAffairs internationalBusiness internationalBusiness:Accounting internationalBusiness:AccountingAndAdvisoryServices internationalBusiness:BrandManagement internationalBusiness:BusinessAnalytics internationalBusiness:CorporateInnovation internationalBusiness:EntrepreneurialStartups internationalBusiness:FamilyBusiness internationalBusiness:Finance internationalBusiness:Fintech internationalBusiness:HealthcareManagementAndConsulting internationalBusiness:Management internationalBusiness:ManagementInformationSystems internationalBusiness:Marketing internationalBusiness:MarketingAnalytics internationalBusiness:SocialInnovationAndEntrepreneurship internationalBusiness:SupplyChainManagement journalism landscapeArchitecture linguistics marineBiology mathematics mechanicalEngineering mediaAndScreenStudies mediaArts music musicTechnology nursing pharmaceuticalSciences pharmacy(PharmD) philosophy physics politicalScience politicsPhilosophyEconomics psychology publicHealth publicRelations religiousStudies sociology spanish speechLanguagePathologyAndAudiology theatre"` + College models.College `json:"college" validate:"omitempty,oneof=CAMD DMSB KCCS CE BCHS SL CPS CS CSSH"` + GraduationCycle models.GraduationCycle `json:"graduation_cycle" validate:"omitempty,max=255,oneof=december may"` + GraduationYear int16 `json:"graduation_year" validate:"omitempty"` +} + +type UpdateUserRequestBody struct { + FirstName string `json:"first_name" validate:"omitempty,max=255"` + LastName string `json:"last_name" validate:"omitempty,max=255"` + Major0 models.Major `json:"major0" validate:"not_equal_if_not_empty=Major1,not_equal_if_not_empty=Major2,omitempty,max=255,oneof=africanaStudies americanSignLanguage americanSignLanguage-EnglishInterpreting appliedPhysics architecturalStudies architecture art:ArtVisualStudies behavioralNeuroscience biochemistry bioengineering biology biomedicalPhysics businessAdministration businessAdministration:Accounting businessAdministration:AccountingAndAdvisoryServices businessAdministration:BrandManagement businessAdministration:BusinessAnalytics businessAdministration:CorporateInnovation businessAdministration:EntrepreneurialStartups businessAdministration:FamilyBusiness businessAdministration:Finance businessAdministration:Fintech businessAdministration:HealthcareManagementAndConsulting businessAdministration:Management businessAdministration:ManagementInformationSystems businessAdministration:Marketing businessAdministration:MarketingAnalytics businessAdministration:SocialInnovationAndEntrepreneurship businessAdministration:SupplyChainManagement cellAndMolecularBiology chemicalEngineering chemistry civilEngineering communicationStudies computerEngineering computerScience computingAndLaw criminologyAndCriminalJustice culturalAnthropology cybersecurity dataScience design economics electricalEngineering english environmentalAndSustainabilityStudies environmentalEngineering environmentalScience environmentalStudies gameArtAndAnimation gameDesign globalAsianStudies healthScience history historyCultureAndLaw humanServices industrialEngineering internationalAffairs internationalBusiness internationalBusiness:Accounting internationalBusiness:AccountingAndAdvisoryServices internationalBusiness:BrandManagement internationalBusiness:BusinessAnalytics internationalBusiness:CorporateInnovation internationalBusiness:EntrepreneurialStartups internationalBusiness:FamilyBusiness internationalBusiness:Finance internationalBusiness:Fintech internationalBusiness:HealthcareManagementAndConsulting internationalBusiness:Management internationalBusiness:ManagementInformationSystems internationalBusiness:Marketing internationalBusiness:MarketingAnalytics internationalBusiness:SocialInnovationAndEntrepreneurship internationalBusiness:SupplyChainManagement journalism landscapeArchitecture linguistics marineBiology mathematics mechanicalEngineering mediaAndScreenStudies mediaArts music musicTechnology nursing pharmaceuticalSciences pharmacy(PharmD) philosophy physics politicalScience politicsPhilosophyEconomics psychology publicHealth publicRelations religiousStudies sociology spanish speechLanguagePathologyAndAudiology theatre"` + Major1 models.Major `json:"major1" validate:"not_equal_if_not_empty=Major0,not_equal_if_not_empty=Major2,omitempty,max=255,oneof=africanaStudies americanSignLanguage americanSignLanguage-EnglishInterpreting appliedPhysics architecturalStudies architecture art:ArtVisualStudies behavioralNeuroscience biochemistry bioengineering biology biomedicalPhysics businessAdministration businessAdministration:Accounting businessAdministration:AccountingAndAdvisoryServices businessAdministration:BrandManagement businessAdministration:BusinessAnalytics businessAdministration:CorporateInnovation businessAdministration:EntrepreneurialStartups businessAdministration:FamilyBusiness businessAdministration:Finance businessAdministration:Fintech businessAdministration:HealthcareManagementAndConsulting businessAdministration:Management businessAdministration:ManagementInformationSystems businessAdministration:Marketing businessAdministration:MarketingAnalytics businessAdministration:SocialInnovationAndEntrepreneurship businessAdministration:SupplyChainManagement cellAndMolecularBiology chemicalEngineering chemistry civilEngineering communicationStudies computerEngineering computerScience computingAndLaw criminologyAndCriminalJustice culturalAnthropology cybersecurity dataScience design economics electricalEngineering english environmentalAndSustainabilityStudies environmentalEngineering environmentalScience environmentalStudies gameArtAndAnimation gameDesign globalAsianStudies healthScience history historyCultureAndLaw humanServices industrialEngineering internationalAffairs internationalBusiness internationalBusiness:Accounting internationalBusiness:AccountingAndAdvisoryServices internationalBusiness:BrandManagement internationalBusiness:BusinessAnalytics internationalBusiness:CorporateInnovation internationalBusiness:EntrepreneurialStartups internationalBusiness:FamilyBusiness internationalBusiness:Finance internationalBusiness:Fintech internationalBusiness:HealthcareManagementAndConsulting internationalBusiness:Management internationalBusiness:ManagementInformationSystems internationalBusiness:Marketing internationalBusiness:MarketingAnalytics internationalBusiness:SocialInnovationAndEntrepreneurship internationalBusiness:SupplyChainManagement journalism landscapeArchitecture linguistics marineBiology mathematics mechanicalEngineering mediaAndScreenStudies mediaArts music musicTechnology nursing pharmaceuticalSciences pharmacy(PharmD) philosophy physics politicalScience politicsPhilosophyEconomics psychology publicHealth publicRelations religiousStudies sociology spanish speechLanguagePathologyAndAudiology theatre"` + Major2 models.Major `json:"major2" validate:"not_equal_if_not_empty=Major0,not_equal_if_not_empty=Major1,omitempty,max=255,oneof=africanaStudies americanSignLanguage americanSignLanguage-EnglishInterpreting appliedPhysics architecturalStudies architecture art:ArtVisualStudies behavioralNeuroscience biochemistry bioengineering biology biomedicalPhysics businessAdministration businessAdministration:Accounting businessAdministration:AccountingAndAdvisoryServices businessAdministration:BrandManagement businessAdministration:BusinessAnalytics businessAdministration:CorporateInnovation businessAdministration:EntrepreneurialStartups businessAdministration:FamilyBusiness businessAdministration:Finance businessAdministration:Fintech businessAdministration:HealthcareManagementAndConsulting businessAdministration:Management businessAdministration:ManagementInformationSystems businessAdministration:Marketing businessAdministration:MarketingAnalytics businessAdministration:SocialInnovationAndEntrepreneurship businessAdministration:SupplyChainManagement cellAndMolecularBiology chemicalEngineering chemistry civilEngineering communicationStudies computerEngineering computerScience computingAndLaw criminologyAndCriminalJustice culturalAnthropology cybersecurity dataScience design economics electricalEngineering english environmentalAndSustainabilityStudies environmentalEngineering environmentalScience environmentalStudies gameArtAndAnimation gameDesign globalAsianStudies healthScience history historyCultureAndLaw humanServices industrialEngineering internationalAffairs internationalBusiness internationalBusiness:Accounting internationalBusiness:AccountingAndAdvisoryServices internationalBusiness:BrandManagement internationalBusiness:BusinessAnalytics internationalBusiness:CorporateInnovation internationalBusiness:EntrepreneurialStartups internationalBusiness:FamilyBusiness internationalBusiness:Finance internationalBusiness:Fintech internationalBusiness:HealthcareManagementAndConsulting internationalBusiness:Management internationalBusiness:ManagementInformationSystems internationalBusiness:Marketing internationalBusiness:MarketingAnalytics internationalBusiness:SocialInnovationAndEntrepreneurship internationalBusiness:SupplyChainManagement journalism landscapeArchitecture linguistics marineBiology mathematics mechanicalEngineering mediaAndScreenStudies mediaArts music musicTechnology nursing pharmaceuticalSciences pharmacy(PharmD) philosophy physics politicalScience politicsPhilosophyEconomics psychology publicHealth publicRelations religiousStudies sociology spanish speechLanguagePathologyAndAudiology theatre"` + College models.College `json:"college" validate:"omitempty,oneof=CAMD DMSB KCCS CE BCHS SL CPS CS CSSH"` + GraduationCycle models.GraduationCycle `json:"graduation_cycle" validate:"omitempty,max=255,oneof=december may"` + GraduationYear int16 `json:"graduation_year" validate:"omitempty"` +} diff --git a/backend/entities/users/base/service.go b/backend/entities/users/base/service.go index 5b3bf7037..98a56f7e7 100644 --- a/backend/entities/users/base/service.go +++ b/backend/entities/users/base/service.go @@ -4,6 +4,7 @@ import ( "errors" "github.com/GenerateNU/sac/backend/auth" + authEntities "github.com/GenerateNU/sac/backend/entities/auth" "github.com/GenerateNU/sac/backend/entities/models" "github.com/garrettladley/fiberpaginate" @@ -16,8 +17,8 @@ type UserServiceInterface interface { GetUsers(pageInfo fiberpaginate.PageInfo) ([]models.User, error) GetMe(id string) (*models.User, error) GetUser(id string) (*models.User, error) - UpdateUser(id string, userBody models.UpdateUserRequestBody) (*models.User, error) - UpdatePassword(id string, passwordBody models.UpdatePasswordRequestBody) error + UpdateUser(id string, userBody UpdateUserRequestBody) (*models.User, error) + UpdatePassword(id string, passwordBody authEntities.UpdatePasswordRequestBody) error DeleteUser(id string) error } @@ -56,13 +57,13 @@ func (u *UserService) GetUser(id string) (*models.User, error) { return users.GetUser(u.DB, *idAsUUID) } -func (u *UserService) UpdateUser(id string, userBody models.UpdateUserRequestBody) (*models.User, error) { +func (u *UserService) UpdateUser(id string, userBody UpdateUserRequestBody) (*models.User, error) { idAsUUID, idErr := utilities.ValidateID(id) if idErr != nil { return nil, idErr } - if utilities.AtLeastOne(userBody, models.UpdateUserRequestBody{}) { + if utilities.AtLeastOne(userBody, UpdateUserRequestBody{}) { return nil, errors.New("no fields to update") } @@ -78,7 +79,7 @@ func (u *UserService) UpdateUser(id string, userBody models.UpdateUserRequestBod return UpdateUser(u.DB, *idAsUUID, *user) } -func (u *UserService) UpdatePassword(id string, passwordBody models.UpdatePasswordRequestBody) error { +func (u *UserService) UpdatePassword(id string, passwordBody authEntities.UpdatePasswordRequestBody) error { idAsUUID, err := utilities.ValidateID(id) if err != nil { return err diff --git a/backend/utilities/validator.go b/backend/utilities/validator.go index 256ef84f0..b371907ba 100644 --- a/backend/utilities/validator.go +++ b/backend/utilities/validator.go @@ -60,7 +60,10 @@ func validateS3URL(fl validator.FieldLevel) bool { } func validateContactPointer(validate *validator.Validate, fl validator.FieldLevel) bool { - contact, ok := fl.Parent().Interface().(models.PutContactRequestBody) + contact, ok := fl.Parent().Interface().(struct { + Type models.ContactType + Content string + }) if !ok { return false } From 660402b7d882f44a6a8f23afc05bee80f7bc8ada Mon Sep 17 00:00:00 2001 From: Garrett Ladley <92384606+garrettladley@users.noreply.github.com> Date: Fri, 17 May 2024 20:46:53 -0400 Subject: [PATCH 14/28] fix: default role to student in register & password err handling revamp (#826) --- backend/auth/password.go | 13 ++++++++++--- backend/entities/auth/base/service.go | 14 ++++---------- backend/entities/users/base/service.go | 12 +++--------- backend/utilities/{error.go => api_error.go} | 0 backend/utilities/map.go | 13 +++++++++++++ backend/utilities/maybe_error.go | 13 +++++++++++++ backend/utilities/string.go | 20 ++++++++++++++++++++ backend/utilities/validator.go | 20 ++++++++++++++------ 8 files changed, 77 insertions(+), 28 deletions(-) rename backend/utilities/{error.go => api_error.go} (100%) create mode 100644 backend/utilities/map.go create mode 100644 backend/utilities/maybe_error.go create mode 100644 backend/utilities/string.go diff --git a/backend/auth/password.go b/backend/auth/password.go index 81e58e773..724e63563 100644 --- a/backend/auth/password.go +++ b/backend/auth/password.go @@ -1,6 +1,7 @@ package auth import ( + "errors" "fmt" "regexp" "strings" @@ -9,16 +10,22 @@ import ( ) func ValidatePassword(password string) error { + var errs []string + if len(password) < 8 { - return fmt.Errorf("password must be at least 8 characters long") + errs = append(errs, "must be at least 8 characters long") } if !hasDigit(password) { - return fmt.Errorf("password must contain at least one digit") + errs = append(errs, "must contain at least one digit") } if !hasSpecialChar(password) { - return fmt.Errorf("password must contain at least one special character") + errs = append(errs, fmt.Sprintf("must contain at least one special character from: [%v]", string(constants.SPECIAL_CHARACTERS))) + } + + if len(errs) > 0 { + return errors.New(strings.Join(errs, ", ")) } return nil diff --git a/backend/entities/auth/base/service.go b/backend/entities/auth/base/service.go index 679591f86..9b8b98d54 100644 --- a/backend/entities/auth/base/service.go +++ b/backend/entities/auth/base/service.go @@ -43,11 +43,7 @@ func NewAuthService(serviceParams types.ServiceParams) AuthServiceInterface { } func (a *AuthService) Login(loginBody authEntities.LoginResponseBody) (*models.User, *auth.Token, error) { - if err := utilities.Validate(a.Validate, loginBody); err != nil { - return nil, nil, err - } - - if err := auth.ValidatePassword(loginBody.Password); err != nil { + if err := utilities.Validate(a.Validate, loginBody, *utilities.NewMaybeError("password", auth.ValidatePassword(loginBody.Password))); err != nil { return nil, nil, err } @@ -83,11 +79,7 @@ func (a *AuthService) Login(loginBody authEntities.LoginResponseBody) (*models.U } func (a *AuthService) Register(userBody usersEntities.CreateUserRequestBody) (*models.User, *auth.Token, error) { - if err := utilities.Validate(a.Validate, userBody); err != nil { - return nil, nil, err - } - - if err := auth.ValidatePassword(userBody.Password); err != nil { + if err := utilities.Validate(a.Validate, userBody, *utilities.NewMaybeError("password", auth.ValidatePassword(userBody.Password))); err != nil { return nil, nil, err } @@ -96,6 +88,8 @@ func (a *AuthService) Register(userBody usersEntities.CreateUserRequestBody) (*m return nil, nil, err } + user.Role = models.Student + passwordHash, err := auth.ComputeHash(userBody.Password) if err != nil { return nil, nil, err diff --git a/backend/entities/users/base/service.go b/backend/entities/users/base/service.go index 98a56f7e7..92b03cfa2 100644 --- a/backend/entities/users/base/service.go +++ b/backend/entities/users/base/service.go @@ -85,15 +85,9 @@ func (u *UserService) UpdatePassword(id string, passwordBody authEntities.Update return err } - if err := utilities.Validate(u.Validate, passwordBody); err != nil { - return err - } - - if err := auth.ValidatePassword(passwordBody.OldPassword); err != nil { - return err - } - - if err := auth.ValidatePassword(passwordBody.NewPassword); err != nil { + if err := utilities.Validate(u.Validate, passwordBody, + *utilities.NewMaybeError("old_password", auth.ValidatePassword(passwordBody.OldPassword)), + *utilities.NewMaybeError("new_password", auth.ValidatePassword(passwordBody.NewPassword))); err != nil { return err } diff --git a/backend/utilities/error.go b/backend/utilities/api_error.go similarity index 100% rename from backend/utilities/error.go rename to backend/utilities/api_error.go diff --git a/backend/utilities/map.go b/backend/utilities/map.go new file mode 100644 index 000000000..756705977 --- /dev/null +++ b/backend/utilities/map.go @@ -0,0 +1,13 @@ +package utilities + +func MergeMaps[K comparable, V any](maps ...map[K]V) map[K]V { + merged := make(map[K]V) + + for _, m := range maps { + for key, value := range m { + merged[key] = value + } + } + + return merged +} diff --git a/backend/utilities/maybe_error.go b/backend/utilities/maybe_error.go new file mode 100644 index 000000000..5df2f933a --- /dev/null +++ b/backend/utilities/maybe_error.go @@ -0,0 +1,13 @@ +package utilities + +type MaybeError struct { + Name string + Err error +} + +func NewMaybeError(name string, err error) *MaybeError { + return &MaybeError{ + Name: name, + Err: err, + } +} diff --git a/backend/utilities/string.go b/backend/utilities/string.go new file mode 100644 index 000000000..4ac51703b --- /dev/null +++ b/backend/utilities/string.go @@ -0,0 +1,20 @@ +package utilities + +import ( + "strings" + "unicode" +) + +func ToSnakeCase(s string) string { + var builder strings.Builder + builder.Grow(len(s) * 2) // Preallocate space for efficiency + + for i, c := range s { + if i > 0 && unicode.IsUpper(c) { + builder.WriteRune('_') + } + builder.WriteRune(unicode.ToLower(c)) + } + + return builder.String() +} diff --git a/backend/utilities/validator.go b/backend/utilities/validator.go index b371907ba..c4b9add5c 100644 --- a/backend/utilities/validator.go +++ b/backend/utilities/validator.go @@ -115,21 +115,29 @@ func ValidateNonNegative(value string) (*int, error) { return &valueAsInt, nil } -func Validate(validate *validator.Validate, s any) error { +func Validate(validate *validator.Validate, s any, maybeErrs ...MaybeError) error { + errors := make(map[string]string) + + for _, maybeErr := range maybeErrs { + if maybeErr.Err != nil { + errors[maybeErr.Name] = maybeErr.Err.Error() + } + } + if err := validate.Struct(s); err != nil { validationErrs, ok := err.(validator.ValidationErrors) if ok { - errors := make(map[string]string, len(validationErrs)) - for _, validationErr := range validationErrs { - errors[validationErr.Field()] = fmt.Sprintf("%s failed %s", validationErr.Field(), validationErr.Tag()) + errors[ToSnakeCase(validationErr.Field())] = fmt.Sprintf("%s failed %s", validationErr.Field(), validationErr.Tag()) } - - return InvalidRequestData(errors) } else { return fmt.Errorf("failed to validate struct: %w", err) } } + if len(errors) > 0 { + return InvalidRequestData(errors) + } + return nil } From 123e25c6f3bbcbccfee8178f042327533792327e Mon Sep 17 00:00:00 2001 From: Garrett Ladley <92384606+garrettladley@users.noreply.github.com> Date: Fri, 17 May 2024 20:50:13 -0400 Subject: [PATCH 15/28] reog: split models files by responsibility & swag (#828) --- backend/docs/docs.go | 4416 +++---- backend/docs/swagger.json | 10544 ++++++++--------- backend/docs/swagger.yaml | 5080 ++++---- backend/entities/auth/base/controller.go | 13 +- backend/entities/auth/base/models.go | 16 + backend/entities/auth/base/service.go | 8 +- backend/entities/models/club.go | 17 - backend/entities/models/college.go | 15 + backend/entities/models/graduation_cycle.go | 8 + backend/entities/models/major.go | 107 + backend/entities/models/recruitment_cycle.go | 10 + backend/entities/models/recruitment_type.go | 9 + backend/entities/models/role.go | 8 + backend/entities/models/tokens.go | 6 + backend/entities/models/user.go | 139 - backend/entities/models/verification.go | 15 - 16 files changed, 8881 insertions(+), 11530 deletions(-) create mode 100644 backend/entities/auth/base/models.go create mode 100644 backend/entities/models/college.go create mode 100644 backend/entities/models/graduation_cycle.go create mode 100644 backend/entities/models/major.go create mode 100644 backend/entities/models/recruitment_cycle.go create mode 100644 backend/entities/models/recruitment_type.go create mode 100644 backend/entities/models/role.go create mode 100644 backend/entities/models/tokens.go diff --git a/backend/docs/docs.go b/backend/docs/docs.go index 948a0d437..38a673141 100644 --- a/backend/docs/docs.go +++ b/backend/docs/docs.go @@ -83,7 +83,7 @@ const docTemplate = `{ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/models.LoginResponseBody" + "$ref": "#/definitions/auth.LoginResponseBody" } } ], @@ -214,6 +214,53 @@ const docTemplate = `{ } } }, + "/auth/register": { + "post": { + "description": "Registers a user", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "auth" + ], + "summary": "Registers a user", + "operationId": "register-user", + "parameters": [ + { + "description": "User Body", + "name": "userBody", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/base.CreateUserRequestBody" + } + } + ], + "responses": { + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/models.User" + } + }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "404": { + "description": "Not Found", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} + } + } + } + }, "/auth/send-code": { "post": { "description": "Sends a verification code", @@ -282,7 +329,7 @@ const docTemplate = `{ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/models.VerifyEmailRequestBody" + "$ref": "#/definitions/base.VerifyEmailRequestBody" } } ], @@ -334,7 +381,7 @@ const docTemplate = `{ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/models.VerifyPasswordResetTokenRequestBody" + "$ref": "#/definitions/base.VerifyPasswordResetTokenRequestBody" } } ], @@ -814,7 +861,7 @@ const docTemplate = `{ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/CreateClubRequestBody" + "$ref": "#/definitions/base.CreateClubRequestBody" } } ], @@ -956,7 +1003,7 @@ const docTemplate = `{ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/UpdateClubRequestBody" + "$ref": "#/definitions/base.UpdateClubRequestBody" } } ], @@ -1057,7 +1104,7 @@ const docTemplate = `{ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/PutContactRequestBody" + "$ref": "#/definitions/contacts.PutContactRequestBody" } } ], @@ -1735,7 +1782,7 @@ const docTemplate = `{ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/CreateClubTagsRequestBody" + "$ref": "#/definitions/tags.CreateClubTagsRequestBody" } } ], @@ -2025,55 +2072,6 @@ const docTemplate = `{ "schema": {} } } - }, - "post": { - "description": "Creates an event", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "event" - ], - "summary": "Create an event", - "operationId": "create-event", - "parameters": [ - { - "description": "Event Body", - "name": "event", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/events.CreateEventRequestBody" - } - } - ], - "responses": { - "201": { - "description": "Created", - "schema": { - "$ref": "#/definitions/models.Event" - } - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "401": { - "description": "Unauthorized", - "schema": {} - }, - "404": { - "description": "Not Found", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } } }, "/events/{eventID}/": { @@ -2116,31 +2114,41 @@ const docTemplate = `{ "schema": {} } } - }, - "delete": { - "description": "Deletes an event", + } + }, + "/files/": { + "get": { + "description": "Retrieves all files", "produces": [ "application/json" ], "tags": [ - "event" + "file" ], - "summary": "Delete an event", - "operationId": "delete-event", + "summary": "Retrieve all files", + "operationId": "get-files", "parameters": [ { - "type": "string", - "description": "Event ID", - "name": "eventID", - "in": "path", - "required": true + "type": "integer", + "description": "Limit", + "name": "limit", + "in": "query" + }, + { + "type": "integer", + "description": "Page", + "name": "page", + "in": "query" } ], "responses": { - "204": { - "description": "No Content", + "200": { + "description": "OK", "schema": { - "type": "string" + "type": "array", + "items": { + "$ref": "#/definitions/models.File" + } } }, "400": { @@ -2160,42 +2168,46 @@ const docTemplate = `{ "schema": {} } } - } - }, - "/events/{eventID}/hosts": { - "get": { - "description": "Retrieves all hosts associated with an event", + }, + "post": { + "description": "Creates a file", + "consumes": [ + "multipart/form-data" + ], "produces": [ "application/json" ], "tags": [ - "event" + "file" ], - "summary": "Retrieve all hosts by event", - "operationId": "get-hosts-by-event", + "summary": "Create a file", + "operationId": "create-file", "parameters": [ { - "type": "string", - "description": "Event ID", - "name": "eventID", - "in": "path", - "required": true + "description": "File", + "name": "file", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/base.CreateFileRequestBody" + } } ], "responses": { - "200": { - "description": "OK", + "201": { + "description": "Created", "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/models.Club" - } + "$ref": "#/definitions/models.File" } }, "400": { "description": "Bad Request", "schema": {} }, + "401": { + "description": "Unauthorized", + "schema": {} + }, "404": { "description": "Not Found", "schema": {} @@ -2207,22 +2219,22 @@ const docTemplate = `{ } } }, - "/events/{eventID}/series/": { + "/files/:fileID": { "get": { - "description": "Retrieves all series associated with an event", + "description": "Retrieves a file", "produces": [ "application/json" ], "tags": [ - "event" + "file" ], - "summary": "Retrieve all series by event", - "operationId": "get-series-by-event", + "summary": "Retrieve a file", + "operationId": "get-file", "parameters": [ { "type": "string", - "description": "Event ID", - "name": "eventID", + "description": "File ID", + "name": "fileID", "in": "path", "required": true } @@ -2231,16 +2243,17 @@ const docTemplate = `{ "200": { "description": "OK", "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/models.Series" - } + "$ref": "#/definitions/models.File" } }, "400": { "description": "Bad Request", "schema": {} }, + "401": { + "description": "Unauthorized", + "schema": {} + }, "404": { "description": "Not Found", "schema": {} @@ -2252,29 +2265,29 @@ const docTemplate = `{ } }, "delete": { - "description": "Deletes all series associated with an event", + "description": "Deletes a file", "produces": [ "application/json" ], "tags": [ - "event" + "file" ], - "summary": "Delete all series by event", - "operationId": "delete-series-by-event", + "summary": "Delete a file", + "operationId": "delete-file", "parameters": [ { "type": "string", - "description": "Event ID", - "name": "eventID", + "description": "File ID", + "name": "fileID", "in": "path", "required": true } ], "responses": { - "204": { - "description": "No Content", + "201": { + "description": "Created", "schema": { - "type": "string" + "$ref": "#/definitions/models.File" } }, "400": { @@ -2294,87 +2307,80 @@ const docTemplate = `{ "schema": {} } } - }, - "patch": { - "description": "Creates a series", - "consumes": [ - "application/json" - ], + } + }, + "/pocs/": { + "get": { + "description": "Retrieves all point of contacts", "produces": [ "application/json" ], "tags": [ - "event" + "point of contact" ], - "summary": "Create a series", - "operationId": "create-series", + "summary": "Retrieve all point of contacts", + "operationId": "get-point-of-contacts", "parameters": [ { - "type": "string", - "description": "Event ID", - "name": "eventID", - "in": "path", - "required": true + "type": "integer", + "description": "Limit", + "name": "limit", + "in": "query" }, { - "description": "Series Body", - "name": "seriesBody", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/events.UpdateEventRequestBody" - } + "type": "integer", + "description": "Page", + "name": "page", + "in": "query" } ], "responses": { - "201": { - "description": "Created", + "200": { + "description": "OK", "schema": { - "$ref": "#/definitions/models.Series" + "type": "array", + "items": { + "$ref": "#/definitions/models.PointOfContact" + } } }, "400": { "description": "Bad Request", - "schema": {} - }, - "401": { - "description": "Unauthorized", - "schema": {} + "schema": { + "type": "string" + } }, "404": { "description": "Not Found", - "schema": {} + "schema": { + "type": "string" + } }, "500": { "description": "Internal Server Error", - "schema": {} + "schema": { + "type": "string" + } } } } }, - "/events/{eventID}/series/{seriesID}/": { + "/pocs/{pocID}/": { "get": { - "description": "Retrieves a series by ID", + "description": "Retrieves a point of contact by id", "produces": [ "application/json" ], "tags": [ - "event" + "point of contact" ], - "summary": "Retrieve a series by ID", - "operationId": "get-series-by-id", + "summary": "Retrieves a point of contact", + "operationId": "get-point-of-contact", "parameters": [ { "type": "string", - "description": "Event ID", - "name": "eventID", - "in": "path", - "required": true - }, - { - "type": "string", - "description": "Series ID", - "name": "seriesID", + "description": "Point of Contact ID", + "name": "pocID", "in": "path", "required": true } @@ -2383,64 +2389,69 @@ const docTemplate = `{ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/models.Series" + "$ref": "#/definitions/models.PointOfContact" } }, "400": { "description": "Bad Request", - "schema": {} + "schema": { + "type": "string" + } }, "404": { "description": "Not Found", - "schema": {} + "schema": { + "type": "string" + } }, "500": { "description": "Internal Server Error", - "schema": {} + "schema": { + "type": "string" + } } } - }, - "delete": { - "description": "Deletes a series by ID", + } + }, + "/tags": { + "get": { + "description": "Retrieves all tags", "produces": [ "application/json" ], "tags": [ - "event" + "tag" ], - "summary": "Delete a series by ID", - "operationId": "delete-series-by-id", + "summary": "Retrieve all tags", + "operationId": "get-all-tags", "parameters": [ { - "type": "string", - "description": "Event ID", - "name": "eventID", - "in": "path", - "required": true + "type": "integer", + "description": "Limit", + "name": "limit", + "in": "query" }, { - "type": "string", - "description": "Series ID", - "name": "seriesID", - "in": "path", - "required": true + "type": "integer", + "description": "Page", + "name": "page", + "in": "query" } ], "responses": { - "204": { - "description": "No Content", + "200": { + "description": "OK", "schema": { - "type": "string" + "type": "array", + "items": { + "$ref": "#/definitions/models.Tag" + } } }, "400": { "description": "Bad Request", "schema": {} }, - "401": { - "description": "Unauthorized", - "schema": {} - }, "404": { "description": "Not Found", "schema": {} @@ -2450,9 +2461,11 @@ const docTemplate = `{ "schema": {} } } - }, - "patch": { - "description": "Updates a series by event ID", + } + }, + "/tags/": { + "post": { + "description": "Creates a tag", "consumes": [ "application/json" ], @@ -2460,33 +2473,26 @@ const docTemplate = `{ "application/json" ], "tags": [ - "event" + "tag" ], - "summary": "Update a series by event ID", - "operationId": "update-series-by-event-id", + "summary": "Create a tag", + "operationId": "create-tag", "parameters": [ { - "type": "string", - "description": "Event ID", - "name": "eventID", - "in": "path", - "required": true - }, - { - "description": "Series Body", - "name": "seriesBody", + "description": "Tag Body", + "name": "tagBody", "in": "body", "required": true, "schema": { - "$ref": "#/definitions/models.UpdateSeriesRequestBody" + "$ref": "#/definitions/base.CreateTagRequestBody" } } ], "responses": { - "200": { - "description": "OK", + "201": { + "description": "Created", "schema": { - "$ref": "#/definitions/models.Series" + "$ref": "#/definitions/models.Tag" } }, "400": { @@ -2508,22 +2514,22 @@ const docTemplate = `{ } } }, - "/events/{eventID}/tags": { + "/tags/{tagID}/": { "get": { - "description": "Retrieves all tags associated with an event", + "description": "Retrieves a tag", "produces": [ "application/json" ], "tags": [ - "event" + "tag" ], - "summary": "Retrieve all tags by event", - "operationId": "get-tags-by-event", + "summary": "Retrieve a tag", + "operationId": "get-tag", "parameters": [ { "type": "string", - "description": "Event ID", - "name": "eventID", + "description": "Tag ID", + "name": "tagID", "in": "path", "required": true } @@ -2532,10 +2538,7 @@ const docTemplate = `{ "200": { "description": "OK", "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/models.Tag" - } + "$ref": "#/definitions/models.Tag" } }, "400": { @@ -2551,41 +2554,31 @@ const docTemplate = `{ "schema": {} } } - } - }, - "/files/": { - "get": { - "description": "Retrieves all files", + }, + "delete": { + "description": "Deletes a tag", "produces": [ "application/json" ], "tags": [ - "file" + "tag" ], - "summary": "Retrieve all files", - "operationId": "get-files", + "summary": "Delete a tag", + "operationId": "delete-tag", "parameters": [ { - "type": "integer", - "description": "Limit", - "name": "limit", - "in": "query" - }, - { - "type": "integer", - "description": "Page", - "name": "page", - "in": "query" + "type": "string", + "description": "Tag ID", + "name": "tagID", + "in": "path", + "required": true } ], "responses": { - "200": { - "description": "OK", + "204": { + "description": "No Content", "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/models.File" - } + "type": "string" } }, "400": { @@ -2606,35 +2599,42 @@ const docTemplate = `{ } } }, - "post": { - "description": "Creates a file", + "patch": { + "description": "Updates a tag", "consumes": [ - "multipart/form-data" + "application/json" ], "produces": [ "application/json" ], "tags": [ - "file" + "tag" ], - "summary": "Create a file", - "operationId": "create-file", + "summary": "Update a tag", + "operationId": "update-tag", "parameters": [ { - "description": "File", - "name": "file", + "type": "string", + "description": "Tag ID", + "name": "tagID", + "in": "path", + "required": true + }, + { + "description": "Tag", + "name": "tag", "in": "body", "required": true, "schema": { - "$ref": "#/definitions/CreateFileRequestBody" + "$ref": "#/definitions/base.UpdateTagRequestBody" } } ], "responses": { - "201": { - "description": "Created", + "200": { + "description": "OK", "schema": { - "$ref": "#/definitions/models.File" + "$ref": "#/definitions/models.Tag" } }, "400": { @@ -2656,31 +2656,39 @@ const docTemplate = `{ } } }, - "/files/:fileID": { + "/users/": { "get": { - "description": "Retrieves a file", + "description": "Retrieves all users", "produces": [ "application/json" ], "tags": [ - "file" + "user" ], - "summary": "Retrieve a file", - "operationId": "get-file", + "summary": "Retrieve all users", + "operationId": "get-users", "parameters": [ { - "type": "string", - "description": "File ID", - "name": "fileID", - "in": "path", - "required": true + "type": "integer", + "description": "Limit", + "name": "limit", + "in": "query" + }, + { + "type": "integer", + "description": "Page", + "name": "page", + "in": "query" } ], "responses": { "200": { "description": "OK", "schema": { - "$ref": "#/definitions/models.File" + "type": "array", + "items": { + "$ref": "#/definitions/models.User" + } } }, "400": { @@ -2691,40 +2699,38 @@ const docTemplate = `{ "description": "Unauthorized", "schema": {} }, - "404": { - "description": "Not Found", - "schema": {} - }, "500": { "description": "Internal Server Error", "schema": {} } } - }, - "delete": { - "description": "Deletes a file", + } + }, + "/users/{userID}/": { + "get": { + "description": "Retrieves a user", "produces": [ "application/json" ], "tags": [ - "file" + "user" ], - "summary": "Delete a file", - "operationId": "delete-file", + "summary": "Retrieve a user", + "operationId": "get-user", "parameters": [ { "type": "string", - "description": "File ID", - "name": "fileID", + "description": "User ID", + "name": "userID", "in": "path", "required": true } ], "responses": { - "201": { - "description": "Created", + "200": { + "description": "OK", "schema": { - "$ref": "#/definitions/models.File" + "$ref": "#/definitions/models.User" } }, "400": { @@ -2744,135 +2750,126 @@ const docTemplate = `{ "schema": {} } } - } - }, - "/pocs/": { - "get": { - "description": "Retrieves all point of contacts", + }, + "delete": { + "description": "Deletes a user", "produces": [ "application/json" ], "tags": [ - "point of contact" + "user" ], - "summary": "Retrieve all point of contacts", - "operationId": "get-point-of-contacts", + "summary": "Delete a user", + "operationId": "delete-user", "parameters": [ { - "type": "integer", - "description": "Limit", - "name": "limit", - "in": "query" - }, - { - "type": "integer", - "description": "Page", - "name": "page", - "in": "query" + "type": "string", + "description": "User ID", + "name": "userID", + "in": "path", + "required": true } ], "responses": { - "200": { - "description": "OK", + "204": { + "description": "No Content", "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/models.PointOfContact" - } + "type": "string" } }, "400": { "description": "Bad Request", - "schema": { - "type": "string" - } + "schema": {} + }, + "401": { + "description": "Unauthorized", + "schema": {} }, "404": { "description": "Not Found", - "schema": { - "type": "string" - } + "schema": {} }, "500": { "description": "Internal Server Error", - "schema": { - "type": "string" - } + "schema": {} } } - } - }, - "/pocs/{pocID}/": { - "get": { - "description": "Retrieves a point of contact by id", + }, + "patch": { + "description": "Updates a user", + "consumes": [ + "application/json" + ], "produces": [ "application/json" ], "tags": [ - "point of contact" + "user" ], - "summary": "Retrieves a point of contact", - "operationId": "get-point-of-contact", + "summary": "Update a user", + "operationId": "update-user", "parameters": [ { "type": "string", - "description": "Point of Contact ID", - "name": "pocID", + "description": "User ID", + "name": "userID", "in": "path", "required": true + }, + { + "description": "User Body", + "name": "userBody", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/base.UpdateUserRequestBody" + } } ], "responses": { "200": { "description": "OK", "schema": { - "$ref": "#/definitions/models.PointOfContact" + "$ref": "#/definitions/models.User" } }, "400": { "description": "Bad Request", - "schema": { - "type": "string" - } + "schema": {} + }, + "401": { + "description": "Unauthorized", + "schema": {} }, "404": { "description": "Not Found", - "schema": { - "type": "string" - } + "schema": {} }, "500": { "description": "Internal Server Error", - "schema": { - "type": "string" - } + "schema": {} } } } }, - "/tags": { + "/users/{userID}/follower/": { "get": { - "description": "Retrieves all tags", + "description": "Retrieves all clubs a user is following", "produces": [ "application/json" ], "tags": [ - "tag" + "user-follower" ], - "summary": "Retrieve all tags", - "operationId": "get-all-tags", + "summary": "Retrieve all clubs a user is following", + "operationId": "get-following", "parameters": [ { - "type": "integer", - "description": "Limit", - "name": "limit", - "in": "query" - }, - { - "type": "integer", - "description": "Page", - "name": "page", - "in": "query" + "type": "string", + "description": "User ID", + "name": "userID", + "in": "path", + "required": true } ], "responses": { @@ -2881,7 +2878,7 @@ const docTemplate = `{ "schema": { "type": "array", "items": { - "$ref": "#/definitions/models.Tag" + "$ref": "#/definitions/models.Club" } } }, @@ -2889,6 +2886,10 @@ const docTemplate = `{ "description": "Bad Request", "schema": {} }, + "401": { + "description": "Unauthorized", + "schema": {} + }, "404": { "description": "Not Found", "schema": {} @@ -2900,9 +2901,9 @@ const docTemplate = `{ } } }, - "/tags/": { + "/users/{userID}/follower/{clubID}/": { "post": { - "description": "Creates a tag", + "description": "Follow a club", "consumes": [ "application/json" ], @@ -2910,32 +2911,33 @@ const docTemplate = `{ "application/json" ], "tags": [ - "tag" + "user-follower" ], - "summary": "Create a tag", - "operationId": "create-tag", + "summary": "Follow a club", + "operationId": "create-following", "parameters": [ { - "description": "Tag Body", - "name": "tagBody", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/CreateTagRequestBody" - } + "type": "string", + "description": "User ID", + "name": "userID", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "Club ID", + "name": "clubID", + "in": "path", + "required": true } ], "responses": { "201": { "description": "Created", "schema": { - "$ref": "#/definitions/models.Tag" + "$ref": "#/definitions/utilities.SuccessResponse" } }, - "400": { - "description": "Bad Request", - "schema": {} - }, "401": { "description": "Unauthorized", "schema": {} @@ -2949,37 +2951,45 @@ const docTemplate = `{ "schema": {} } } - } - }, - "/tags/{tagID}/": { - "get": { - "description": "Retrieves a tag", + }, + "delete": { + "description": "Unfollow a club", + "consumes": [ + "application/json" + ], "produces": [ "application/json" ], "tags": [ - "tag" + "user-follower" ], - "summary": "Retrieve a tag", - "operationId": "get-tag", + "summary": "Unfollow a club", + "operationId": "delete-following", "parameters": [ { "type": "string", - "description": "Tag ID", - "name": "tagID", + "description": "User ID", + "name": "userID", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "Club ID", + "name": "clubID", "in": "path", "required": true } ], "responses": { - "200": { - "description": "OK", + "204": { + "description": "No Content", "schema": { - "$ref": "#/definitions/models.Tag" + "$ref": "#/definitions/utilities.SuccessResponse" } }, - "400": { - "description": "Bad Request", + "401": { + "description": "Unauthorized", "schema": {} }, "404": { @@ -2991,31 +3001,36 @@ const docTemplate = `{ "schema": {} } } - }, - "delete": { - "description": "Deletes a tag", + } + }, + "/users/{userID}/member/": { + "get": { + "description": "Retrieves all clubs a user is a member of", "produces": [ "application/json" ], "tags": [ - "tag" + "user-member" ], - "summary": "Delete a tag", - "operationId": "delete-tag", + "summary": "Retrieve all clubs a user is a member of", + "operationId": "get-membership", "parameters": [ { "type": "string", - "description": "Tag ID", - "name": "tagID", + "description": "User ID", + "name": "userID", "in": "path", "required": true } ], "responses": { - "204": { - "description": "No Content", + "200": { + "description": "OK", "schema": { - "type": "string" + "type": "array", + "items": { + "$ref": "#/definitions/models.Club" + } } }, "400": { @@ -3035,9 +3050,11 @@ const docTemplate = `{ "schema": {} } } - }, + } + }, + "/users/{userID}/password": { "patch": { - "description": "Updates a tag", + "description": "Updates a user's password", "consumes": [ "application/json" ], @@ -3045,25 +3062,25 @@ const docTemplate = `{ "application/json" ], "tags": [ - "tag" + "user" ], - "summary": "Update a tag", - "operationId": "update-tag", + "summary": "Update a user's password", + "operationId": "update-password", "parameters": [ { "type": "string", - "description": "Tag ID", - "name": "tagID", + "description": "User ID", + "name": "userID", "in": "path", "required": true }, { - "description": "Tag", - "name": "tag", + "description": "Password Body", + "name": "passwordBody", "in": "body", "required": true, "schema": { - "$ref": "#/definitions/UpdateTagRequestBody" + "$ref": "#/definitions/auth.UpdatePasswordRequestBody" } } ], @@ -3071,7 +3088,7 @@ const docTemplate = `{ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/models.Tag" + "type": "string" } }, "400": { @@ -3093,29 +3110,24 @@ const docTemplate = `{ } } }, - "/users/": { + "/users/{userID}/tags/": { "get": { - "description": "Retrieves all users", + "description": "Retrieves all tags associated with a user", "produces": [ "application/json" ], "tags": [ - "user" + "user-tag" ], - "summary": "Retrieve all users", - "operationId": "get-users", + "summary": "Retrieve all tags for a user", + "operationId": "get-tags-by-user", "parameters": [ { - "type": "integer", - "description": "Limit", - "name": "limit", - "in": "query" - }, - { - "type": "integer", - "description": "Page", - "name": "page", - "in": "query" + "type": "string", + "description": "User ID", + "name": "userID", + "in": "path", + "required": true } ], "responses": { @@ -3124,7 +3136,7 @@ const docTemplate = `{ "schema": { "type": "array", "items": { - "$ref": "#/definitions/models.User" + "$ref": "#/definitions/models.Tag" } } }, @@ -3136,6 +3148,10 @@ const docTemplate = `{ "description": "Unauthorized", "schema": {} }, + "404": { + "description": "Not Found", + "schema": {} + }, "500": { "description": "Internal Server Error", "schema": {} @@ -3143,7 +3159,7 @@ const docTemplate = `{ } }, "post": { - "description": "Creates a user", + "description": "Creates tags for a user", "consumes": [ "application/json" ], @@ -3151,62 +3167,10 @@ const docTemplate = `{ "application/json" ], "tags": [ - "user" + "user-tag" ], - "summary": "Create a user", - "operationId": "create-user", - "parameters": [ - { - "description": "User Body", - "name": "userBody", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/CreateUserRequestBody" - } - } - ], - "responses": { - "201": { - "description": "Created", - "schema": { - "$ref": "#/definitions/models.User" - } - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "401": { - "description": "Unauthorized", - "schema": {} - }, - "404": { - "description": "Not Found", - "schema": {} - }, - "409": { - "description": "Conflict", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - } - }, - "/users/{userID}/": { - "get": { - "description": "Retrieves a user", - "produces": [ - "application/json" - ], - "tags": [ - "user" - ], - "summary": "Retrieve a user", - "operationId": "get-user", + "summary": "Create user tags", + "operationId": "create-user-tags", "parameters": [ { "type": "string", @@ -3214,57 +3178,25 @@ const docTemplate = `{ "name": "userID", "in": "path", "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/models.User" - } - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "401": { - "description": "Unauthorized", - "schema": {} - }, - "404": { - "description": "Not Found", - "schema": {} }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - }, - "delete": { - "description": "Deletes a user", - "produces": [ - "application/json" - ], - "tags": [ - "user" - ], - "summary": "Delete a user", - "operationId": "delete-user", - "parameters": [ { - "type": "string", - "description": "User ID", - "name": "userID", - "in": "path", - "required": true + "description": "User Tags Body", + "name": "userTagsBody", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/tags.CreateUserTagsBody" + } } ], "responses": { - "204": { - "description": "No Content", + "201": { + "description": "Created", "schema": { - "type": "string" + "type": "array", + "items": { + "$ref": "#/definitions/models.Tag" + } } }, "400": { @@ -3285,8 +3217,8 @@ const docTemplate = `{ } } }, - "patch": { - "description": "Updates a user", + "delete": { + "description": "Creates tags for a user", "consumes": [ "application/json" ], @@ -3294,10 +3226,10 @@ const docTemplate = `{ "application/json" ], "tags": [ - "user" + "user-tag" ], - "summary": "Update a user", - "operationId": "update-user", + "summary": "Create user tags", + "operationId": "create-user-tags", "parameters": [ { "type": "string", @@ -3305,23 +3237,11 @@ const docTemplate = `{ "name": "userID", "in": "path", "required": true - }, - { - "description": "User Body", - "name": "userBody", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/UpdateUserRequestBody" - } } ], "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/models.User" - } + "201": { + "description": "Created" }, "400": { "description": "Bad Request", @@ -3341,921 +3261,319 @@ const docTemplate = `{ } } } + } + }, + "definitions": { + "auth.LoginResponseBody": { + "type": "object", + "required": [ + "email", + "password" + ], + "properties": { + "email": { + "type": "string" + }, + "password": { + "description": "MARK: must be validated manually", + "type": "string", + "maxLength": 255 + } + } }, - "/users/{userID}/follower/": { - "get": { - "description": "Retrieves all clubs a user is following", - "produces": [ - "application/json" - ], - "tags": [ - "user-follower" - ], - "summary": "Retrieve all clubs a user is following", - "operationId": "get-following", - "parameters": [ - { - "type": "string", - "description": "User ID", - "name": "userID", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/models.Club" - } - } - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "401": { - "description": "Unauthorized", - "schema": {} - }, - "404": { - "description": "Not Found", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } + "auth.UpdatePasswordRequestBody": { + "type": "object", + "required": [ + "new_password", + "old_password" + ], + "properties": { + "new_password": { + "description": "MARK: must be validated manually", + "type": "string", + "maxLength": 255 + }, + "old_password": { + "description": "MARK: must be validated manually", + "type": "string", + "maxLength": 255 } } }, - "/users/{userID}/follower/{clubID}/": { - "post": { - "description": "Follow a club", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "user-follower" - ], - "summary": "Follow a club", - "operationId": "create-following", - "parameters": [ - { - "type": "string", - "description": "User ID", - "name": "userID", - "in": "path", - "required": true - }, - { - "type": "string", - "description": "Club ID", - "name": "clubID", - "in": "path", - "required": true - } - ], - "responses": { - "201": { - "description": "Created", - "schema": { - "$ref": "#/definitions/utilities.SuccessResponse" - } - }, - "401": { - "description": "Unauthorized", - "schema": {} - }, - "404": { - "description": "Not Found", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - }, - "delete": { - "description": "Unfollow a club", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "user-follower" - ], - "summary": "Unfollow a club", - "operationId": "delete-following", - "parameters": [ - { - "type": "string", - "description": "User ID", - "name": "userID", - "in": "path", - "required": true - }, - { - "type": "string", - "description": "Club ID", - "name": "clubID", - "in": "path", - "required": true - } - ], - "responses": { - "204": { - "description": "No Content", - "schema": { - "$ref": "#/definitions/utilities.SuccessResponse" + "base.CreateClubRequestBody": { + "type": "object", + "required": [ + "application_link", + "description", + "is_recruiting", + "name", + "preview", + "recruitment_cycle", + "recruitment_type", + "user_id" + ], + "properties": { + "application_link": { + "type": "string", + "maxLength": 255 + }, + "description": { + "type": "string", + "maxLength": 255 + }, + "is_recruiting": { + "type": "boolean" + }, + "logo": { + "type": "string", + "maxLength": 255 + }, + "name": { + "type": "string", + "maxLength": 255 + }, + "one_word_to_describe_us": { + "type": "string", + "maxLength": 255 + }, + "preview": { + "type": "string", + "maxLength": 255 + }, + "recruitment_cycle": { + "maxLength": 255, + "enum": [ + "fall", + "spring", + "fallSpring", + "always" + ], + "allOf": [ + { + "$ref": "#/definitions/models.RecruitmentCycle" } - }, - "401": { - "description": "Unauthorized", - "schema": {} - }, - "404": { - "description": "Not Found", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } + ] + }, + "recruitment_type": { + "maxLength": 255, + "enum": [ + "unrestricted", + "tryout", + "application" + ], + "allOf": [ + { + "$ref": "#/definitions/models.RecruitmentType" + } + ] + }, + "user_id": { + "type": "string" + }, + "weekly_time_commitment": { + "type": "integer", + "minimum": 1 } } }, - "/users/{userID}/member/": { - "get": { - "description": "Retrieves all clubs a user is a member of", - "produces": [ - "application/json" - ], - "tags": [ - "user-member" - ], - "summary": "Retrieve all clubs a user is a member of", - "operationId": "get-membership", - "parameters": [ - { - "type": "string", - "description": "User ID", - "name": "userID", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/models.Club" - } - } - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "401": { - "description": "Unauthorized", - "schema": {} - }, - "404": { - "description": "Not Found", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } + "base.CreateFileRequestBody": { + "type": "object", + "required": [ + "owner_id", + "owner_type" + ], + "properties": { + "owner_id": { + "type": "string" + }, + "owner_type": { + "type": "string", + "maxLength": 255 } } }, - "/users/{userID}/password": { - "patch": { - "description": "Updates a user's password", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "user" - ], - "summary": "Update a user's password", - "operationId": "update-password", - "parameters": [ - { - "type": "string", - "description": "User ID", - "name": "userID", - "in": "path", - "required": true - }, - { - "description": "Password Body", - "name": "passwordBody", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/models.UpdatePasswordRequestBody" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "string" - } - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "401": { - "description": "Unauthorized", - "schema": {} - }, - "404": { - "description": "Not Found", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } + "base.CreateTagRequestBody": { + "type": "object", + "required": [ + "category_id", + "name" + ], + "properties": { + "category_id": { + "type": "string" + }, + "name": { + "type": "string", + "maxLength": 255 } } }, - "/users/{userID}/tags/": { - "get": { - "description": "Retrieves all tags associated with a user", - "produces": [ - "application/json" - ], - "tags": [ - "user-tag" - ], - "summary": "Retrieve all tags for a user", - "operationId": "get-tags-by-user", - "parameters": [ - { - "type": "string", - "description": "User ID", - "name": "userID", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/models.Tag" - } - } - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "401": { - "description": "Unauthorized", - "schema": {} - }, - "404": { - "description": "Not Found", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - }, - "post": { - "description": "Creates tags for a user", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "user-tag" - ], - "summary": "Create user tags", - "operationId": "create-user-tags", - "parameters": [ - { - "type": "string", - "description": "User ID", - "name": "userID", - "in": "path", - "required": true - }, - { - "description": "User Tags Body", - "name": "userTagsBody", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/tag.CreateUserTagsBody" - } - } - ], - "responses": { - "201": { - "description": "Created", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/models.Tag" - } - } - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "401": { - "description": "Unauthorized", - "schema": {} - }, - "404": { - "description": "Not Found", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - }, - "delete": { - "description": "Creates tags for a user", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "user-tag" - ], - "summary": "Create user tags", - "operationId": "create-user-tags", - "parameters": [ - { - "type": "string", - "description": "User ID", - "name": "userID", - "in": "path", - "required": true - } - ], - "responses": { - "201": { - "description": "Created" - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "401": { - "description": "Unauthorized", - "schema": {} - }, - "404": { - "description": "Not Found", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - } - } - }, - "definitions": { - "models.Category": { - "type": "object", - "required": [ - "name" - ], - "properties": { - "created_at": { - "type": "string", - "example": "2023-09-20T16:34:50Z" - }, - "id": { - "type": "string", - "example": "123e4567-e89b-12d3-a456-426614174000" - }, - "name": { - "type": "string", - "maxLength": 255 - }, - "updated_at": { - "type": "string", - "example": "2023-09-20T16:34:50Z" - } - } - }, - "categories.CategoryRequestBody": { - "type": "object", - "required": [ - "name" - ], - "properties": { - "name": { - "type": "string", - "maxLength": 255 - } - } - }, - "models.Club": { + "base.CreateUserRequestBody": { "type": "object", "required": [ - "application_link", - "description", - "is_recruiting", - "name", - "num_members", - "preview", - "recruitment_cycle", - "recruitment_type" + "email", + "first_name", + "last_name", + "password" ], "properties": { - "application_link": { - "type": "string", - "maxLength": 255 - }, - "created_at": { - "type": "string", - "example": "2023-09-20T16:34:50Z" - }, - "description": { - "type": "string", - "maxLength": 255 - }, - "id": { - "type": "string", - "example": "123e4567-e89b-12d3-a456-426614174000" - }, - "is_recruiting": { - "type": "boolean" - }, - "logo": { - "type": "string", - "maxLength": 255 - }, - "name": { - "type": "string", - "maxLength": 255 - }, - "num_members": { - "type": "integer", - "minimum": 1 + "college": { + "enum": [ + "CAMD", + "DMSB", + "KCCS", + "CE", + "BCHS", + "SL", + "CPS", + "CS", + "CSSH" + ], + "allOf": [ + { + "$ref": "#/definitions/models.College" + } + ] }, - "one_word_to_describe_us": { + "email": { "type": "string", "maxLength": 255 }, - "preview": { + "first_name": { "type": "string", "maxLength": 255 }, - "recruitment_cycle": { + "graduation_cycle": { "maxLength": 255, "enum": [ - "fall", - "spring", - "fallSpring", - "always" + "december", + "may" ], "allOf": [ { - "$ref": "#/definitions/models.RecruitmentCycle" + "$ref": "#/definitions/models.GraduationCycle" } ] }, - "recruitment_type": { - "maxLength": 255, - "enum": [ - "unrestricted", - "tryout", - "application" - ], - "allOf": [ - { - "$ref": "#/definitions/models.RecruitmentType" - } - ] - }, - "updated_at": { - "type": "string", - "example": "2023-09-20T16:34:50Z" + "graduation_year": { + "type": "integer" }, - "weekly_time_commitment": { - "type": "integer", - "minimum": 1 - } - } - }, - "models.College": { - "type": "string", - "enum": [ - "CAMD", - "DMSB", - "KCCS", - "CE", - "BCHS", - "SL", - "CPS", - "CS", - "CSSH" - ], - "x-enum-comments": { - "BCHS": "Bouvé College of Health Sciences", - "CAMD": "College of Arts, Media and Design", - "CE": "College of Engineering", - "CPS": "College of Professional Studies", - "CS": "College of Science", - "CSSH": "College of Social Sciences and Humanities", - "DMSB": "D'Amore-McKim School of Business", - "KCCS": "Khoury College of Computer Sciences", - "SL": "School of Law" - }, - "x-enum-varnames": [ - "CAMD", - "DMSB", - "KCCS", - "CE", - "BCHS", - "SL", - "CPS", - "CS", - "CSSH" - ] - }, - "models.Contact": { - "type": "object", - "required": [ - "content", - "type" - ], - "properties": { - "content": { + "last_name": { "type": "string", "maxLength": 255 }, - "created_at": { - "type": "string", - "example": "2023-09-20T16:34:50Z" - }, - "id": { - "type": "string", - "example": "123e4567-e89b-12d3-a456-426614174000" - }, - "type": { + "major0": { + "description": "Optional fields", "maxLength": 255, "enum": [ - "facebook", - "instagram", - "x", - "linkedin", - "youtube", - "github", - "slack", - "discord", - "email", - "customSite" + "africanaStudies", + "americanSignLanguage", + "americanSignLanguage-EnglishInterpreting", + "appliedPhysics", + "architecturalStudies", + "architecture", + "art:ArtVisualStudies", + "behavioralNeuroscience", + "biochemistry", + "bioengineering", + "biology", + "biomedicalPhysics", + "businessAdministration", + "businessAdministration:Accounting", + "businessAdministration:AccountingAndAdvisoryServices", + "businessAdministration:BrandManagement", + "businessAdministration:BusinessAnalytics", + "businessAdministration:CorporateInnovation", + "businessAdministration:EntrepreneurialStartups", + "businessAdministration:FamilyBusiness", + "businessAdministration:Finance", + "businessAdministration:Fintech", + "businessAdministration:HealthcareManagementAndConsulting", + "businessAdministration:Management", + "businessAdministration:ManagementInformationSystems", + "businessAdministration:Marketing", + "businessAdministration:MarketingAnalytics", + "businessAdministration:SocialInnovationAndEntrepreneurship", + "businessAdministration:SupplyChainManagement", + "cellAndMolecularBiology", + "chemicalEngineering", + "chemistry", + "civilEngineering", + "communicationStudies", + "computerEngineering", + "computerScience", + "computingAndLaw", + "criminologyAndCriminalJustice", + "culturalAnthropology", + "cybersecurity", + "dataScience", + "design", + "economics", + "electricalEngineering", + "english", + "environmentalAndSustainabilityStudies", + "environmentalEngineering", + "environmentalScience", + "environmentalStudies", + "gameArtAndAnimation", + "gameDesign", + "globalAsianStudies", + "healthScience", + "history", + "historyCultureAndLaw", + "humanServices", + "industrialEngineering", + "internationalAffairs", + "internationalBusiness", + "internationalBusiness:Accounting", + "internationalBusiness:AccountingAndAdvisoryServices", + "internationalBusiness:BrandManagement", + "internationalBusiness:BusinessAnalytics", + "internationalBusiness:CorporateInnovation", + "internationalBusiness:EntrepreneurialStartups", + "internationalBusiness:FamilyBusiness", + "internationalBusiness:Finance", + "internationalBusiness:Fintech", + "internationalBusiness:HealthcareManagementAndConsulting", + "internationalBusiness:Management", + "internationalBusiness:ManagementInformationSystems", + "internationalBusiness:Marketing", + "internationalBusiness:MarketingAnalytics", + "internationalBusiness:SocialInnovationAndEntrepreneurship", + "internationalBusiness:SupplyChainManagement", + "journalism", + "landscapeArchitecture", + "linguistics", + "marineBiology", + "mathematics", + "mechanicalEngineering", + "mediaAndScreenStudies", + "mediaArts", + "music", + "musicTechnology", + "nursing", + "pharmaceuticalSciences", + "pharmacy(PharmD)", + "philosophy", + "physics", + "politicalScience", + "politicsPhilosophyEconomics", + "psychology", + "publicHealth", + "publicRelations", + "religiousStudies", + "sociology", + "spanish", + "speechLanguagePathologyAndAudiology", + "theatre" ], "allOf": [ { - "$ref": "#/definitions/models.ContactType" + "$ref": "#/definitions/models.Major" } ] }, - "updated_at": { - "type": "string", - "example": "2023-09-20T16:34:50Z" - } - } - }, - "models.ContactType": { - "type": "string", - "enum": [ - "facebook", - "instagram", - "x", - "linkedin", - "youtube", - "github", - "slack", - "discord", - "email", - "customSite" - ], - "x-enum-varnames": [ - "Facebook", - "Instagram", - "X", - "LinkedIn", - "YouTube", - "GitHub", - "Slack", - "Discord", - "Email", - "CustomSite" - ] - }, - "CreateClubRequestBody": { - "type": "object", - "required": [ - "application_link", - "description", - "is_recruiting", - "name", - "preview", - "recruitment_cycle", - "recruitment_type", - "user_id" - ], - "properties": { - "application_link": { - "type": "string", - "maxLength": 255 - }, - "description": { - "type": "string", - "maxLength": 255 - }, - "is_recruiting": { - "type": "boolean" - }, - "logo": { - "type": "string", - "maxLength": 255 - }, - "name": { - "type": "string", - "maxLength": 255 - }, - "one_word_to_describe_us": { - "type": "string", - "maxLength": 255 - }, - "preview": { - "type": "string", - "maxLength": 255 - }, - "recruitment_cycle": { - "maxLength": 255, - "enum": [ - "fall", - "spring", - "fallSpring", - "always" - ], - "allOf": [ - { - "$ref": "#/definitions/models.RecruitmentCycle" - } - ] - }, - "recruitment_type": { - "maxLength": 255, - "enum": [ - "unrestricted", - "tryout", - "application" - ], - "allOf": [ - { - "$ref": "#/definitions/models.RecruitmentType" - } - ] - }, - "user_id": { - "type": "string" - }, - "weekly_time_commitment": { - "type": "integer", - "minimum": 1 - } - } - }, - "CreateClubTagsRequestBody": { - "type": "object", - "required": [ - "tags" - ], - "properties": { - "tags": { - "type": "array", - "items": { - "type": "string" - } - } - } - }, - "events.CreateEventRequestBody": { - "type": "object", - "required": [ - "content", - "end_time", - "event_type", - "host", - "is_recurring", - "location", - "name", - "preview", - "start_time" - ], - "properties": { - "content": { - "type": "string", - "maxLength": 255 - }, - "end_time": { - "type": "string" - }, - "event_type": { - "maxLength": 255, - "enum": [ - "open", - "membersOnly" - ], - "allOf": [ - { - "$ref": "#/definitions/models.EventType" - } - ] - }, - "host": { - "description": "TODO club/tag/notification logic", - "type": "string" - }, - "is_recurring": { - "type": "boolean" - }, - "location": { - "type": "string", - "maxLength": 255 - }, - "name": { - "type": "string", - "maxLength": 255 - }, - "preview": { - "type": "string", - "maxLength": 255 - }, - "series": { - "description": "TODO validate if isRecurring, then series is required", - "allOf": [ - { - "$ref": "#/definitions/models.CreateSeriesRequestBody" - } - ] - }, - "start_time": { - "type": "string" - } - } - }, - "CreateFileRequestBody": { - "type": "object", - "required": [ - "owner_id", - "owner_type" - ], - "properties": { - "owner_id": { - "type": "string" - }, - "owner_type": { - "type": "string", - "maxLength": 255 - } - } - }, - "models.CreateSeriesRequestBody": { - "type": "object", - "required": [ - "max_occurrences", - "recurring_type" - ], - "properties": { - "max_occurrences": { - "type": "integer", - "minimum": 2 - }, - "recurring_type": { - "maxLength": 255, - "enum": [ - "daily", - "weekly", - "monthly" - ], - "allOf": [ - { - "$ref": "#/definitions/models.RecurringType" - } - ] - } - } - }, - "CreateTagRequestBody": { - "type": "object", - "required": [ - "category_id", - "name" - ], - "properties": { - "category_id": { - "type": "string" - }, - "name": { - "type": "string", - "maxLength": 255 - } - } - }, - "CreateUserRequestBody": { - "type": "object", - "required": [ - "email", - "first_name", - "last_name", - "password" - ], - "properties": { - "college": { - "enum": [ - "CAMD", - "DMSB", - "KCCS", - "CE", - "BCHS", - "SL", - "CPS", - "CS", - "CSSH" - ], - "allOf": [ - { - "$ref": "#/definitions/models.College" - } - ] - }, - "email": { - "type": "string", - "maxLength": 255 - }, - "first_name": { - "type": "string", - "maxLength": 255 - }, - "graduation_cycle": { - "maxLength": 255, - "enum": [ - "december", - "may" - ], - "allOf": [ - { - "$ref": "#/definitions/models.GraduationCycle" - } - ] - }, - "graduation_year": { - "type": "integer" - }, - "last_name": { - "type": "string", - "maxLength": 255 - }, - "major0": { - "description": "Optional fields", + "major1": { "maxLength": 255, "enum": [ "africanaStudies", @@ -4365,7 +3683,7 @@ const docTemplate = `{ } ] }, - "major1": { + "major2": { "maxLength": 255, "enum": [ "africanaStudies", @@ -4475,12 +3793,143 @@ const docTemplate = `{ } ] }, - "major2": { + "password": { + "description": "MARK: must be validated manually", + "type": "string", + "maxLength": 255 + } + } + }, + "base.UpdateClubRequestBody": { + "type": "object", + "required": [ + "application_link", + "recruitment_cycle", + "recruitment_type" + ], + "properties": { + "application_link": { + "type": "string", + "maxLength": 255 + }, + "description": { + "type": "string", + "maxLength": 255 + }, + "is_recruiting": { + "type": "boolean" + }, + "logo": { + "type": "string", + "maxLength": 255 + }, + "name": { + "type": "string", + "maxLength": 255 + }, + "one_word_to_describe_us": { + "type": "string", + "maxLength": 255 + }, + "preview": { + "type": "string", + "maxLength": 255 + }, + "recruitment_cycle": { "maxLength": 255, "enum": [ - "africanaStudies", - "americanSignLanguage", - "americanSignLanguage-EnglishInterpreting", + "fall", + "spring", + "fallSpring", + "always" + ], + "allOf": [ + { + "$ref": "#/definitions/models.RecruitmentCycle" + } + ] + }, + "recruitment_type": { + "maxLength": 255, + "enum": [ + "unrestricted", + "tryout", + "application" + ], + "allOf": [ + { + "$ref": "#/definitions/models.RecruitmentType" + } + ] + }, + "weekly_time_commitment": { + "type": "integer", + "minimum": 1 + } + } + }, + "base.UpdateTagRequestBody": { + "type": "object", + "properties": { + "category_id": { + "type": "string" + }, + "name": { + "type": "string", + "maxLength": 255 + } + } + }, + "base.UpdateUserRequestBody": { + "type": "object", + "properties": { + "college": { + "enum": [ + "CAMD", + "DMSB", + "KCCS", + "CE", + "BCHS", + "SL", + "CPS", + "CS", + "CSSH" + ], + "allOf": [ + { + "$ref": "#/definitions/models.College" + } + ] + }, + "first_name": { + "type": "string", + "maxLength": 255 + }, + "graduation_cycle": { + "maxLength": 255, + "enum": [ + "december", + "may" + ], + "allOf": [ + { + "$ref": "#/definitions/models.GraduationCycle" + } + ] + }, + "graduation_year": { + "type": "integer" + }, + "last_name": { + "type": "string", + "maxLength": 255 + }, + "major0": { + "maxLength": 255, + "enum": [ + "africanaStudies", + "americanSignLanguage", + "americanSignLanguage-EnglishInterpreting", "appliedPhysics", "architecturalStudies", "architecture", @@ -4585,130 +4034,322 @@ const docTemplate = `{ } ] }, - "password": { - "description": "MARK: must be validated manually", - "type": "string", - "maxLength": 255 - } - } - }, - "models.Event": { - "type": "object", - "required": [ - "content", - "end_time", - "event_type", - "location", - "name", - "preview", - "start_time" - ], - "properties": { - "content": { - "type": "string", - "maxLength": 255 - }, - "created_at": { - "type": "string", - "example": "2023-09-20T16:34:50Z" - }, - "end_time": { - "type": "string" - }, - "event_type": { + "major1": { "maxLength": 255, "enum": [ - "open", - "membersOnly" + "africanaStudies", + "americanSignLanguage", + "americanSignLanguage-EnglishInterpreting", + "appliedPhysics", + "architecturalStudies", + "architecture", + "art:ArtVisualStudies", + "behavioralNeuroscience", + "biochemistry", + "bioengineering", + "biology", + "biomedicalPhysics", + "businessAdministration", + "businessAdministration:Accounting", + "businessAdministration:AccountingAndAdvisoryServices", + "businessAdministration:BrandManagement", + "businessAdministration:BusinessAnalytics", + "businessAdministration:CorporateInnovation", + "businessAdministration:EntrepreneurialStartups", + "businessAdministration:FamilyBusiness", + "businessAdministration:Finance", + "businessAdministration:Fintech", + "businessAdministration:HealthcareManagementAndConsulting", + "businessAdministration:Management", + "businessAdministration:ManagementInformationSystems", + "businessAdministration:Marketing", + "businessAdministration:MarketingAnalytics", + "businessAdministration:SocialInnovationAndEntrepreneurship", + "businessAdministration:SupplyChainManagement", + "cellAndMolecularBiology", + "chemicalEngineering", + "chemistry", + "civilEngineering", + "communicationStudies", + "computerEngineering", + "computerScience", + "computingAndLaw", + "criminologyAndCriminalJustice", + "culturalAnthropology", + "cybersecurity", + "dataScience", + "design", + "economics", + "electricalEngineering", + "english", + "environmentalAndSustainabilityStudies", + "environmentalEngineering", + "environmentalScience", + "environmentalStudies", + "gameArtAndAnimation", + "gameDesign", + "globalAsianStudies", + "healthScience", + "history", + "historyCultureAndLaw", + "humanServices", + "industrialEngineering", + "internationalAffairs", + "internationalBusiness", + "internationalBusiness:Accounting", + "internationalBusiness:AccountingAndAdvisoryServices", + "internationalBusiness:BrandManagement", + "internationalBusiness:BusinessAnalytics", + "internationalBusiness:CorporateInnovation", + "internationalBusiness:EntrepreneurialStartups", + "internationalBusiness:FamilyBusiness", + "internationalBusiness:Finance", + "internationalBusiness:Fintech", + "internationalBusiness:HealthcareManagementAndConsulting", + "internationalBusiness:Management", + "internationalBusiness:ManagementInformationSystems", + "internationalBusiness:Marketing", + "internationalBusiness:MarketingAnalytics", + "internationalBusiness:SocialInnovationAndEntrepreneurship", + "internationalBusiness:SupplyChainManagement", + "journalism", + "landscapeArchitecture", + "linguistics", + "marineBiology", + "mathematics", + "mechanicalEngineering", + "mediaAndScreenStudies", + "mediaArts", + "music", + "musicTechnology", + "nursing", + "pharmaceuticalSciences", + "pharmacy(PharmD)", + "philosophy", + "physics", + "politicalScience", + "politicsPhilosophyEconomics", + "psychology", + "publicHealth", + "publicRelations", + "religiousStudies", + "sociology", + "spanish", + "speechLanguagePathologyAndAudiology", + "theatre" ], "allOf": [ { - "$ref": "#/definitions/models.EventType" + "$ref": "#/definitions/models.Major" } ] }, - "host": { - "type": "string" - }, - "id": { - "type": "string", - "example": "123e4567-e89b-12d3-a456-426614174000" - }, - "is_recurring": { - "type": "boolean" - }, - "location": { - "type": "string", - "maxLength": 255 - }, - "meeting_link": { - "type": "string" - }, - "name": { - "type": "string", - "maxLength": 255 - }, - "preview": { - "type": "string", - "maxLength": 255 - }, - "start_time": { - "type": "string" - }, - "updated_at": { - "type": "string", - "example": "2023-09-20T16:34:50Z" - } - } - }, - "models.EventType": { - "type": "string", - "enum": [ - "open", - "membersOnly" - ], - "x-enum-varnames": [ - "Open", - "MembersOnly" - ] + "major2": { + "maxLength": 255, + "enum": [ + "africanaStudies", + "americanSignLanguage", + "americanSignLanguage-EnglishInterpreting", + "appliedPhysics", + "architecturalStudies", + "architecture", + "art:ArtVisualStudies", + "behavioralNeuroscience", + "biochemistry", + "bioengineering", + "biology", + "biomedicalPhysics", + "businessAdministration", + "businessAdministration:Accounting", + "businessAdministration:AccountingAndAdvisoryServices", + "businessAdministration:BrandManagement", + "businessAdministration:BusinessAnalytics", + "businessAdministration:CorporateInnovation", + "businessAdministration:EntrepreneurialStartups", + "businessAdministration:FamilyBusiness", + "businessAdministration:Finance", + "businessAdministration:Fintech", + "businessAdministration:HealthcareManagementAndConsulting", + "businessAdministration:Management", + "businessAdministration:ManagementInformationSystems", + "businessAdministration:Marketing", + "businessAdministration:MarketingAnalytics", + "businessAdministration:SocialInnovationAndEntrepreneurship", + "businessAdministration:SupplyChainManagement", + "cellAndMolecularBiology", + "chemicalEngineering", + "chemistry", + "civilEngineering", + "communicationStudies", + "computerEngineering", + "computerScience", + "computingAndLaw", + "criminologyAndCriminalJustice", + "culturalAnthropology", + "cybersecurity", + "dataScience", + "design", + "economics", + "electricalEngineering", + "english", + "environmentalAndSustainabilityStudies", + "environmentalEngineering", + "environmentalScience", + "environmentalStudies", + "gameArtAndAnimation", + "gameDesign", + "globalAsianStudies", + "healthScience", + "history", + "historyCultureAndLaw", + "humanServices", + "industrialEngineering", + "internationalAffairs", + "internationalBusiness", + "internationalBusiness:Accounting", + "internationalBusiness:AccountingAndAdvisoryServices", + "internationalBusiness:BrandManagement", + "internationalBusiness:BusinessAnalytics", + "internationalBusiness:CorporateInnovation", + "internationalBusiness:EntrepreneurialStartups", + "internationalBusiness:FamilyBusiness", + "internationalBusiness:Finance", + "internationalBusiness:Fintech", + "internationalBusiness:HealthcareManagementAndConsulting", + "internationalBusiness:Management", + "internationalBusiness:ManagementInformationSystems", + "internationalBusiness:Marketing", + "internationalBusiness:MarketingAnalytics", + "internationalBusiness:SocialInnovationAndEntrepreneurship", + "internationalBusiness:SupplyChainManagement", + "journalism", + "landscapeArchitecture", + "linguistics", + "marineBiology", + "mathematics", + "mechanicalEngineering", + "mediaAndScreenStudies", + "mediaArts", + "music", + "musicTechnology", + "nursing", + "pharmaceuticalSciences", + "pharmacy(PharmD)", + "philosophy", + "physics", + "politicalScience", + "politicsPhilosophyEconomics", + "psychology", + "publicHealth", + "publicRelations", + "religiousStudies", + "sociology", + "spanish", + "speechLanguagePathologyAndAudiology", + "theatre" + ], + "allOf": [ + { + "$ref": "#/definitions/models.Major" + } + ] + } + } }, - "models.File": { + "base.VerifyEmailRequestBody": { "type": "object", "required": [ - "file_name", - "file_size", - "file_type", - "file_url", - "object_key" + "email", + "token" ], "properties": { - "created_at": { - "type": "string", - "example": "2023-09-20T16:34:50Z" + "email": { + "type": "string" }, - "file_name": { + "token": { + "type": "string" + } + } + }, + "base.VerifyPasswordResetTokenRequestBody": { + "type": "object", + "required": [ + "new_password", + "token", + "verify_new_password" + ], + "properties": { + "new_password": { "type": "string", - "maxLength": 255 + "minLength": 8 }, - "file_size": { - "type": "integer", - "minimum": 1 + "token": { + "type": "string" }, - "file_type": { + "verify_new_password": { + "type": "string", + "minLength": 8 + } + } + }, + "categories.CategoryRequestBody": { + "type": "object", + "required": [ + "name" + ], + "properties": { + "name": { "type": "string", "maxLength": 255 - }, - "file_url": { + } + } + }, + "contacts.PutContactRequestBody": { + "type": "object", + "required": [ + "content", + "type" + ], + "properties": { + "content": { "type": "string", "maxLength": 255 }, + "type": { + "maxLength": 255, + "enum": [ + "facebook", + "instagram", + "x", + "linkedin", + "youtube", + "github", + "slack", + "discord", + "email", + "customSite" + ], + "allOf": [ + { + "$ref": "#/definitions/models.ContactType" + } + ] + } + } + }, + "models.Category": { + "type": "object", + "properties": { + "created_at": { + "type": "string", + "example": "2023-09-20T16:34:50Z" + }, "id": { "type": "string", "example": "123e4567-e89b-12d3-a456-426614174000" }, - "object_key": { - "type": "string", - "maxLength": 255 + "name": { + "type": "string" }, "updated_at": { "type": "string", @@ -4716,380 +4357,108 @@ const docTemplate = `{ } } }, - "models.GraduationCycle": { - "type": "string", - "enum": [ - "december", - "may" - ], - "x-enum-varnames": [ - "December", - "May" - ] - }, - "models.LoginResponseBody": { + "models.Club": { "type": "object", - "required": [ - "email", - "password" - ], "properties": { - "email": { + "application_link": { "type": "string" }, - "password": { - "description": "MARK: must be validated manually", - "type": "string", - "maxLength": 255 - } - } - }, - "models.Major": { - "type": "string", - "enum": [ - "africanaStudies", - "americanSignLanguage", - "americanSignLanguage-EnglishInterpreting", - "appliedPhysics", - "architecturalStudies", - "architecture", - "art:ArtVisualStudies", - "behavioralNeuroscience", - "biochemistry", - "bioengineering", - "biology", - "biomedicalPhysics", - "businessAdministration", - "businessAdministration:Accounting", - "businessAdministration:AccountingAndAdvisoryServices", - "businessAdministration:BrandManagement", - "businessAdministration:BusinessAnalytics", - "businessAdministration:CorporateInnovation", - "businessAdministration:EntrepreneurialStartups", - "businessAdministration:FamilyBusiness", - "businessAdministration:Finance", - "businessAdministration:Fintech", - "businessAdministration:HealthcareManagementAndConsulting", - "businessAdministration:Management", - "businessAdministration:ManagementInformationSystems", - "businessAdministration:Marketing", - "businessAdministration:MarketingAnalytics", - "businessAdministration:SocialInnovationAndEntrepreneurship", - "businessAdministration:SupplyChainManagement", - "cellAndMolecularBiology", - "chemicalEngineering", - "chemistry", - "civilEngineering", - "communicationStudies", - "computerEngineering", - "computerScience", - "computingAndLaw", - "criminologyAndCriminalJustice", - "culturalAnthropology", - "cybersecurity", - "dataScience", - "design", - "economics", - "electricalEngineering", - "english", - "environmentalAndSustainabilityStudies", - "environmentalEngineering", - "environmentalScience", - "environmentalStudies", - "gameArtAndAnimation", - "gameDesign", - "globalAsianStudies", - "healthScience", - "history", - "historyCultureAndLaw", - "humanServices", - "industrialEngineering", - "internationalAffairs", - "internationalBusiness", - "internationalBusiness:Accounting", - "internationalBusiness:AccountingAndAdvisoryServices", - "internationalBusiness:BrandManagement", - "internationalBusiness:BusinessAnalytics", - "internationalBusiness:CorporateInnovation", - "internationalBusiness:EntrepreneurialStartups", - "internationalBusiness:FamilyBusiness", - "internationalBusiness:Finance", - "internationalBusiness:Fintech", - "internationalBusiness:HealthcareManagementAndConsulting", - "internationalBusiness:Management", - "internationalBusiness:ManagementInformationSystems", - "internationalBusiness:Marketing", - "internationalBusiness:MarketingAnalytics", - "internationalBusiness:SocialInnovationAndEntrepreneurship", - "internationalBusiness:SupplyChainManagement", - "journalism", - "landscapeArchitecture", - "linguistics", - "marineBiology", - "mathematics", - "mechanicalEngineering", - "mediaAndScreenStudies", - "mediaArts", - "music", - "musicTechnology", - "nursing", - "pharmaceuticalSciences", - "pharmacy(PharmD)", - "philosophy", - "physics", - "politicalScience", - "politicsPhilosophyEconomics", - "psychology", - "publicHealth", - "publicRelations", - "religiousStudies", - "sociology", - "spanish", - "speechLanguagePathologyAndAudiology", - "theatre" - ], - "x-enum-varnames": [ - "AfricanaStudies", - "AmericanSignLanguage", - "AmericanSignLanguageEnglishInterpreting", - "AppliedPhysics", - "ArchitecturalStudies", - "Architecture", - "ArtArtVisualStudies", - "BehavioralNeuroscience", - "Biochemistry", - "Bioengineering", - "Biology", - "BiomedicalPhysics", - "BusinessAdministration", - "BusinessAdministrationAccounting", - "BusinessAdministrationAccountingAndAdvisoryServices", - "BusinessAdministrationBrandManagement", - "BusinessAdministrationBusinessAnalytics", - "BusinessAdministrationCorporateInnovation", - "BusinessAdministrationEntrepreneurialStartups", - "BusinessAdministrationFamilyBusiness", - "BusinessAdministrationFinance", - "BusinessAdministrationFintech", - "BusinessAdministrationHealthcareManagementAndConsulting", - "BusinessAdministrationManagement", - "BusinessAdministrationManagementInformationSystems", - "BusinessAdministrationMarketing", - "BusinessAdministrationMarketingAnalytics", - "BusinessAdministrationSocialInnovationAndEntrepreneurship", - "BusinessAdministrationSupplyChainManagement", - "CellAndMolecularBiology", - "ChemicalEngineering", - "Chemistry", - "CivilEngineering", - "CommunicationStudies", - "ComputerEngineering", - "ComputerScience", - "ComputingAndLaw", - "CriminologyAndCriminalJustice", - "CulturalAnthropology", - "Cybersecurity", - "DataScience", - "Design", - "Economics", - "ElectricalEngineering", - "English", - "EnvironmentalAndSustainabilityStudies", - "EnvironmentalEngineering", - "EnvironmentalScience", - "EnvironmentalStudies", - "GameArtAndAnimation", - "GameDesign", - "GlobalAsianStudies", - "HealthScience", - "History", - "HistoryCultureAndLaw", - "HumanServices", - "IndustrialEngineering", - "InternationalAffairs", - "InternationalBusiness", - "InternationalBusinessAccounting", - "InternationalBusinessAccountingAndAdvisoryServices", - "InternationalBusinessBrandManagement", - "InternationalBusinessBusinessAnalytics", - "InternationalBusinessCorporateInnovation", - "InternationalBusinessEntrepreneurialStartups", - "InternationalBusinessFamilyBusiness", - "InternationalBusinessFinance", - "InternationalBusinessFintech", - "InternationalBusinessHealthcareManagementAndConsulting", - "InternationalBusinessManagement", - "InternationalBusinessManagementInformationSystems", - "InternationalBusinessMarketing", - "InternationalBusinessMarketingAnalytics", - "InternationalBusinessSocialInnovationAndEntrepreneurship", - "InternationalBusinessSupplyChainManagement", - "Journalism", - "LandscapeArchitecture", - "Linguistics", - "MarineBiology", - "Mathematics", - "MechanicalEngineering", - "MediaAndScreenStudies", - "MediaArts", - "Music", - "MusicTechnology", - "Nursing", - "PharmaceuticalSciences", - "PharmacyPharmD", - "Philosophy", - "Physics", - "PoliticalScience", - "PoliticsPhilosophyEconomics", - "Psychology", - "PublicHealth", - "PublicRelations", - "ReligiousStudies", - "Sociology", - "Spanish", - "SpeechLanguagePathologyAndAudiology", - "Theatre" - ] - }, - "models.PointOfContact": { - "type": "object", - "required": [ - "email", - "name", - "position" - ], - "properties": { - "created_at": { + "created_at": { "type": "string", "example": "2023-09-20T16:34:50Z" }, - "email": { - "type": "string", - "maxLength": 255 + "description": { + "type": "string" }, "id": { "type": "string", "example": "123e4567-e89b-12d3-a456-426614174000" }, + "is_recruiting": { + "type": "boolean" + }, + "logo": { + "type": "string" + }, "name": { - "type": "string", - "maxLength": 255 + "type": "string" }, - "photo_file": { - "$ref": "#/definitions/models.File" + "num_members": { + "type": "integer" }, - "position": { - "type": "string", - "maxLength": 255 + "one_word_to_describe_us": { + "type": "string" + }, + "preview": { + "type": "string" + }, + "recruitment_cycle": { + "$ref": "#/definitions/models.RecruitmentCycle" + }, + "recruitment_type": { + "$ref": "#/definitions/models.RecruitmentType" }, "updated_at": { "type": "string", "example": "2023-09-20T16:34:50Z" - } - } - }, - "PutContactRequestBody": { - "type": "object", - "required": [ - "content", - "type" - ], - "properties": { - "content": { - "type": "string", - "maxLength": 255 }, - "type": { - "maxLength": 255, - "enum": [ - "facebook", - "instagram", - "x", - "linkedin", - "youtube", - "github", - "slack", - "discord", - "email", - "customSite" - ], - "allOf": [ - { - "$ref": "#/definitions/models.ContactType" - } - ] + "weekly_time_commitment": { + "type": "integer" } } }, - "models.RecruitmentCycle": { + "models.College": { "type": "string", "enum": [ - "fall", - "spring", - "fallSpring", - "always" - ], - "x-enum-varnames": [ - "Fall", - "Spring", - "FallSpring", - "Always" - ] - }, - "models.RecruitmentType": { - "type": "string", - "enum": [ - "unrestricted", - "tryout", - "application" - ], - "x-enum-varnames": [ - "Unrestricted", - "Tryout", - "Application" - ] - }, - "models.RecurringType": { - "type": "string", - "enum": [ - "daily", - "weekly", - "monthly" + "CAMD", + "DMSB", + "KCCS", + "CE", + "BCHS", + "SL", + "CPS", + "CS", + "CSSH" ], + "x-enum-comments": { + "BCHS": "Bouvé College of Health Sciences", + "CAMD": "College of Arts, Media and Design", + "CE": "College of Engineering", + "CPS": "College of Professional Studies", + "CS": "College of Science", + "CSSH": "College of Social Sciences and Humanities", + "DMSB": "D'Amore-McKim School of Business", + "KCCS": "Khoury College of Computer Sciences", + "SL": "School of Law" + }, "x-enum-varnames": [ - "Daily", - "Weekly", - "Monthly" + "CAMD", + "DMSB", + "KCCS", + "CE", + "BCHS", + "SL", + "CPS", + "CS", + "CSSH" ] }, - "models.Series": { + "models.Contact": { "type": "object", "properties": { + "content": { + "type": "string" + }, "created_at": { "type": "string", "example": "2023-09-20T16:34:50Z" }, - "events": { - "type": "array", - "items": { - "$ref": "#/definitions/models.Event" - } - }, "id": { "type": "string", "example": "123e4567-e89b-12d3-a456-426614174000" }, - "max_occurrences": { - "type": "integer", - "minimum": 1 - }, - "recurring_type": { - "maxLength": 255, - "allOf": [ - { - "$ref": "#/definitions/models.RecurringType" - } - ] + "type": { + "$ref": "#/definitions/models.ContactType" }, "updated_at": { "type": "string", @@ -5097,971 +4466,379 @@ const docTemplate = `{ } } }, - "models.Tag": { - "type": "object", - "required": [ - "category_id", - "name" + "models.ContactType": { + "type": "string", + "enum": [ + "facebook", + "instagram", + "x", + "linkedin", + "youtube", + "github", + "slack", + "discord", + "email", + "customSite" ], + "x-enum-varnames": [ + "Facebook", + "Instagram", + "X", + "LinkedIn", + "YouTube", + "GitHub", + "Slack", + "Discord", + "Email", + "CustomSite" + ] + }, + "models.Event": { + "type": "object", "properties": { - "category_id": { - "type": "string" - }, "created_at": { "type": "string", "example": "2023-09-20T16:34:50Z" }, + "description": { + "type": "string" + }, + "end_time": { + "type": "string" + }, + "event_type": { + "description": "geoshi", + "allOf": [ + { + "$ref": "#/definitions/models.EventType" + } + ] + }, + "host": { + "type": "string" + }, "id": { "type": "string", "example": "123e4567-e89b-12d3-a456-426614174000" }, - "name": { - "type": "string", - "maxLength": 255 - }, - "updated_at": { - "type": "string", - "example": "2023-09-20T16:34:50Z" - } - } - }, - "UpdateClubRequestBody": { - "type": "object", - "required": [ - "application_link", - "recruitment_cycle", - "recruitment_type" - ], - "properties": { - "application_link": { - "type": "string", - "maxLength": 255 + "is_archived": { + "type": "boolean" }, - "description": { - "type": "string", - "maxLength": 255 + "is_draft": { + "type": "boolean" }, - "is_recruiting": { + "is_public": { + "description": "internal housekeeping states", "type": "boolean" }, - "logo": { - "type": "string", - "maxLength": 255 + "link": { + "type": "string" }, - "name": { - "type": "string", - "maxLength": 255 + "location": { + "type": "string" }, - "one_word_to_describe_us": { - "type": "string", - "maxLength": 255 + "name": { + "description": "details", + "type": "string" }, "preview": { - "type": "string", - "maxLength": 255 - }, - "recruitment_cycle": { - "maxLength": 255, - "enum": [ - "fall", - "spring", - "fallSpring", - "always" - ], - "allOf": [ - { - "$ref": "#/definitions/models.RecruitmentCycle" - } - ] + "type": "string" }, - "recruitment_type": { - "maxLength": 255, - "enum": [ - "unrestricted", - "tryout", - "application" - ], - "allOf": [ - { - "$ref": "#/definitions/models.RecruitmentType" - } - ] + "start_time": { + "description": "timing", + "type": "string" }, - "weekly_time_commitment": { - "type": "integer", - "minimum": 1 + "updated_at": { + "type": "string", + "example": "2023-09-20T16:34:50Z" } } }, - "events.UpdateEventRequestBody": { + "models.EventType": { + "type": "string", + "enum": [ + "hybrid", + "in_person", + "virtual" + ], + "x-enum-varnames": [ + "Hybrid", + "InPerson", + "Virtual" + ] + }, + "models.File": { "type": "object", "properties": { - "content": { + "created_at": { "type": "string", - "maxLength": 255 + "example": "2023-09-20T16:34:50Z" }, - "end_time": { + "file_name": { "type": "string" }, - "event_type": { - "maxLength": 255, - "enum": [ - "open", - "membersOnly" - ], - "allOf": [ - { - "$ref": "#/definitions/models.EventType" - } - ] + "file_size": { + "type": "integer" }, - "host": { + "file_type": { "type": "string" }, - "location": { - "type": "string", - "maxLength": 255 - }, - "name": { - "type": "string", - "maxLength": 255 + "file_url": { + "type": "string" }, - "preview": { + "id": { "type": "string", - "maxLength": 255 + "example": "123e4567-e89b-12d3-a456-426614174000" }, - "start_time": { + "object_key": { "type": "string" + }, + "updated_at": { + "type": "string", + "example": "2023-09-20T16:34:50Z" } } }, - "models.UpdatePasswordRequestBody": { - "type": "object", - "required": [ - "new_password", - "old_password" + "models.GraduationCycle": { + "type": "string", + "enum": [ + "december", + "may" ], - "properties": { - "new_password": { - "description": "MARK: must be validated manually", - "type": "string", - "maxLength": 255 - }, - "old_password": { - "description": "MARK: must be validated manually", - "type": "string", - "maxLength": 255 - } - } - }, - "models.UpdateSeriesRequestBody": { - "type": "object", - "properties": { - "event_details": { - "$ref": "#/definitions/events.UpdateEventRequestBody" - }, - "max_occurrences": { - "type": "integer", - "minimum": 2 - }, - "recurring_type": { - "maxLength": 255, - "enum": [ - "daily", - "weekly", - "monthly" - ], - "allOf": [ - { - "$ref": "#/definitions/models.RecurringType" - } - ] - } - } - }, - "UpdateTagRequestBody": { - "type": "object", - "properties": { - "category_id": { - "type": "string" - }, - "name": { - "type": "string", - "maxLength": 255 - } - } + "x-enum-varnames": [ + "December", + "May" + ] }, - "UpdateUserRequestBody": { - "type": "object", - "properties": { - "college": { - "enum": [ - "CAMD", - "DMSB", - "KCCS", - "CE", - "BCHS", - "SL", - "CPS", - "CS", - "CSSH" - ], - "allOf": [ - { - "$ref": "#/definitions/models.College" - } - ] - }, - "first_name": { - "type": "string", - "maxLength": 255 - }, - "graduation_cycle": { - "maxLength": 255, - "enum": [ - "december", - "may" - ], - "allOf": [ - { - "$ref": "#/definitions/models.GraduationCycle" - } - ] - }, - "graduation_year": { - "type": "integer" - }, - "last_name": { - "type": "string", - "maxLength": 255 - }, - "major0": { - "maxLength": 255, - "enum": [ - "africanaStudies", - "americanSignLanguage", - "americanSignLanguage-EnglishInterpreting", - "appliedPhysics", - "architecturalStudies", - "architecture", - "art:ArtVisualStudies", - "behavioralNeuroscience", - "biochemistry", - "bioengineering", - "biology", - "biomedicalPhysics", - "businessAdministration", - "businessAdministration:Accounting", - "businessAdministration:AccountingAndAdvisoryServices", - "businessAdministration:BrandManagement", - "businessAdministration:BusinessAnalytics", - "businessAdministration:CorporateInnovation", - "businessAdministration:EntrepreneurialStartups", - "businessAdministration:FamilyBusiness", - "businessAdministration:Finance", - "businessAdministration:Fintech", - "businessAdministration:HealthcareManagementAndConsulting", - "businessAdministration:Management", - "businessAdministration:ManagementInformationSystems", - "businessAdministration:Marketing", - "businessAdministration:MarketingAnalytics", - "businessAdministration:SocialInnovationAndEntrepreneurship", - "businessAdministration:SupplyChainManagement", - "cellAndMolecularBiology", - "chemicalEngineering", - "chemistry", - "civilEngineering", - "communicationStudies", - "computerEngineering", - "computerScience", - "computingAndLaw", - "criminologyAndCriminalJustice", - "culturalAnthropology", - "cybersecurity", - "dataScience", - "design", - "economics", - "electricalEngineering", - "english", - "environmentalAndSustainabilityStudies", - "environmentalEngineering", - "environmentalScience", - "environmentalStudies", - "gameArtAndAnimation", - "gameDesign", - "globalAsianStudies", - "healthScience", - "history", - "historyCultureAndLaw", - "humanServices", - "industrialEngineering", - "internationalAffairs", - "internationalBusiness", - "internationalBusiness:Accounting", - "internationalBusiness:AccountingAndAdvisoryServices", - "internationalBusiness:BrandManagement", - "internationalBusiness:BusinessAnalytics", - "internationalBusiness:CorporateInnovation", - "internationalBusiness:EntrepreneurialStartups", - "internationalBusiness:FamilyBusiness", - "internationalBusiness:Finance", - "internationalBusiness:Fintech", - "internationalBusiness:HealthcareManagementAndConsulting", - "internationalBusiness:Management", - "internationalBusiness:ManagementInformationSystems", - "internationalBusiness:Marketing", - "internationalBusiness:MarketingAnalytics", - "internationalBusiness:SocialInnovationAndEntrepreneurship", - "internationalBusiness:SupplyChainManagement", - "journalism", - "landscapeArchitecture", - "linguistics", - "marineBiology", - "mathematics", - "mechanicalEngineering", - "mediaAndScreenStudies", - "mediaArts", - "music", - "musicTechnology", - "nursing", - "pharmaceuticalSciences", - "pharmacy(PharmD)", - "philosophy", - "physics", - "politicalScience", - "politicsPhilosophyEconomics", - "psychology", - "publicHealth", - "publicRelations", - "religiousStudies", - "sociology", - "spanish", - "speechLanguagePathologyAndAudiology", - "theatre" - ], - "allOf": [ - { - "$ref": "#/definitions/models.Major" - } - ] - }, - "major1": { - "maxLength": 255, - "enum": [ - "africanaStudies", - "americanSignLanguage", - "americanSignLanguage-EnglishInterpreting", - "appliedPhysics", - "architecturalStudies", - "architecture", - "art:ArtVisualStudies", - "behavioralNeuroscience", - "biochemistry", - "bioengineering", - "biology", - "biomedicalPhysics", - "businessAdministration", - "businessAdministration:Accounting", - "businessAdministration:AccountingAndAdvisoryServices", - "businessAdministration:BrandManagement", - "businessAdministration:BusinessAnalytics", - "businessAdministration:CorporateInnovation", - "businessAdministration:EntrepreneurialStartups", - "businessAdministration:FamilyBusiness", - "businessAdministration:Finance", - "businessAdministration:Fintech", - "businessAdministration:HealthcareManagementAndConsulting", - "businessAdministration:Management", - "businessAdministration:ManagementInformationSystems", - "businessAdministration:Marketing", - "businessAdministration:MarketingAnalytics", - "businessAdministration:SocialInnovationAndEntrepreneurship", - "businessAdministration:SupplyChainManagement", - "cellAndMolecularBiology", - "chemicalEngineering", - "chemistry", - "civilEngineering", - "communicationStudies", - "computerEngineering", - "computerScience", - "computingAndLaw", - "criminologyAndCriminalJustice", - "culturalAnthropology", - "cybersecurity", - "dataScience", - "design", - "economics", - "electricalEngineering", - "english", - "environmentalAndSustainabilityStudies", - "environmentalEngineering", - "environmentalScience", - "environmentalStudies", - "gameArtAndAnimation", - "gameDesign", - "globalAsianStudies", - "healthScience", - "history", - "historyCultureAndLaw", - "humanServices", - "industrialEngineering", - "internationalAffairs", - "internationalBusiness", - "internationalBusiness:Accounting", - "internationalBusiness:AccountingAndAdvisoryServices", - "internationalBusiness:BrandManagement", - "internationalBusiness:BusinessAnalytics", - "internationalBusiness:CorporateInnovation", - "internationalBusiness:EntrepreneurialStartups", - "internationalBusiness:FamilyBusiness", - "internationalBusiness:Finance", - "internationalBusiness:Fintech", - "internationalBusiness:HealthcareManagementAndConsulting", - "internationalBusiness:Management", - "internationalBusiness:ManagementInformationSystems", - "internationalBusiness:Marketing", - "internationalBusiness:MarketingAnalytics", - "internationalBusiness:SocialInnovationAndEntrepreneurship", - "internationalBusiness:SupplyChainManagement", - "journalism", - "landscapeArchitecture", - "linguistics", - "marineBiology", - "mathematics", - "mechanicalEngineering", - "mediaAndScreenStudies", - "mediaArts", - "music", - "musicTechnology", - "nursing", - "pharmaceuticalSciences", - "pharmacy(PharmD)", - "philosophy", - "physics", - "politicalScience", - "politicsPhilosophyEconomics", - "psychology", - "publicHealth", - "publicRelations", - "religiousStudies", - "sociology", - "spanish", - "speechLanguagePathologyAndAudiology", - "theatre" - ], - "allOf": [ - { - "$ref": "#/definitions/models.Major" - } - ] - }, - "major2": { - "maxLength": 255, - "enum": [ - "africanaStudies", - "americanSignLanguage", - "americanSignLanguage-EnglishInterpreting", - "appliedPhysics", - "architecturalStudies", - "architecture", - "art:ArtVisualStudies", - "behavioralNeuroscience", - "biochemistry", - "bioengineering", - "biology", - "biomedicalPhysics", - "businessAdministration", - "businessAdministration:Accounting", - "businessAdministration:AccountingAndAdvisoryServices", - "businessAdministration:BrandManagement", - "businessAdministration:BusinessAnalytics", - "businessAdministration:CorporateInnovation", - "businessAdministration:EntrepreneurialStartups", - "businessAdministration:FamilyBusiness", - "businessAdministration:Finance", - "businessAdministration:Fintech", - "businessAdministration:HealthcareManagementAndConsulting", - "businessAdministration:Management", - "businessAdministration:ManagementInformationSystems", - "businessAdministration:Marketing", - "businessAdministration:MarketingAnalytics", - "businessAdministration:SocialInnovationAndEntrepreneurship", - "businessAdministration:SupplyChainManagement", - "cellAndMolecularBiology", - "chemicalEngineering", - "chemistry", - "civilEngineering", - "communicationStudies", - "computerEngineering", - "computerScience", - "computingAndLaw", - "criminologyAndCriminalJustice", - "culturalAnthropology", - "cybersecurity", - "dataScience", - "design", - "economics", - "electricalEngineering", - "english", - "environmentalAndSustainabilityStudies", - "environmentalEngineering", - "environmentalScience", - "environmentalStudies", - "gameArtAndAnimation", - "gameDesign", - "globalAsianStudies", - "healthScience", - "history", - "historyCultureAndLaw", - "humanServices", - "industrialEngineering", - "internationalAffairs", - "internationalBusiness", - "internationalBusiness:Accounting", - "internationalBusiness:AccountingAndAdvisoryServices", - "internationalBusiness:BrandManagement", - "internationalBusiness:BusinessAnalytics", - "internationalBusiness:CorporateInnovation", - "internationalBusiness:EntrepreneurialStartups", - "internationalBusiness:FamilyBusiness", - "internationalBusiness:Finance", - "internationalBusiness:Fintech", - "internationalBusiness:HealthcareManagementAndConsulting", - "internationalBusiness:Management", - "internationalBusiness:ManagementInformationSystems", - "internationalBusiness:Marketing", - "internationalBusiness:MarketingAnalytics", - "internationalBusiness:SocialInnovationAndEntrepreneurship", - "internationalBusiness:SupplyChainManagement", - "journalism", - "landscapeArchitecture", - "linguistics", - "marineBiology", - "mathematics", - "mechanicalEngineering", - "mediaAndScreenStudies", - "mediaArts", - "music", - "musicTechnology", - "nursing", - "pharmaceuticalSciences", - "pharmacy(PharmD)", - "philosophy", - "physics", - "politicalScience", - "politicsPhilosophyEconomics", - "psychology", - "publicHealth", - "publicRelations", - "religiousStudies", - "sociology", - "spanish", - "speechLanguagePathologyAndAudiology", - "theatre" - ], - "allOf": [ - { - "$ref": "#/definitions/models.Major" - } - ] - } - } - }, - "models.User": { - "type": "object", - "required": [ - "college", - "email", - "first_name", - "graduation_cycle", - "graduation_year", - "last_name", - "major0", - "role" - ], - "properties": { - "college": { - "maxLength": 255, - "allOf": [ - { - "$ref": "#/definitions/models.College" - } - ] - }, - "created_at": { - "type": "string", - "example": "2023-09-20T16:34:50Z" - }, - "email": { - "type": "string", - "maxLength": 255 - }, - "first_name": { - "type": "string", - "maxLength": 255 - }, - "graduation_cycle": { - "maxLength": 255, - "enum": [ - "december", - "may" - ], - "allOf": [ - { - "$ref": "#/definitions/models.GraduationCycle" - } - ] - }, - "graduation_year": { - "type": "integer" - }, - "id": { - "type": "string", - "example": "123e4567-e89b-12d3-a456-426614174000" - }, - "is_verified": { - "type": "boolean" - }, - "last_name": { - "type": "string", - "maxLength": 255 - }, - "major0": { - "maxLength": 255, - "enum": [ - "africanaStudies", - "americanSignLanguage", - "americanSignLanguage-EnglishInterpreting", - "appliedPhysics", - "architecturalStudies", - "architecture", - "art:ArtVisualStudies", - "behavioralNeuroscience", - "biochemistry", - "bioengineering", - "biology", - "biomedicalPhysics", - "businessAdministration", - "businessAdministration:Accounting", - "businessAdministration:AccountingAndAdvisoryServices", - "businessAdministration:BrandManagement", - "businessAdministration:BusinessAnalytics", - "businessAdministration:CorporateInnovation", - "businessAdministration:EntrepreneurialStartups", - "businessAdministration:FamilyBusiness", - "businessAdministration:Finance", - "businessAdministration:Fintech", - "businessAdministration:HealthcareManagementAndConsulting", - "businessAdministration:Management", - "businessAdministration:ManagementInformationSystems", - "businessAdministration:Marketing", - "businessAdministration:MarketingAnalytics", - "businessAdministration:SocialInnovationAndEntrepreneurship", - "businessAdministration:SupplyChainManagement", - "cellAndMolecularBiology", - "chemicalEngineering", - "chemistry", - "civilEngineering", - "communicationStudies", - "computerEngineering", - "computerScience", - "computingAndLaw", - "criminologyAndCriminalJustice", - "culturalAnthropology", - "cybersecurity", - "dataScience", - "design", - "economics", - "electricalEngineering", - "english", - "environmentalAndSustainabilityStudies", - "environmentalEngineering", - "environmentalScience", - "environmentalStudies", - "gameArtAndAnimation", - "gameDesign", - "globalAsianStudies", - "healthScience", - "history", - "historyCultureAndLaw", - "humanServices", - "industrialEngineering", - "internationalAffairs", - "internationalBusiness", - "internationalBusiness:Accounting", - "internationalBusiness:AccountingAndAdvisoryServices", - "internationalBusiness:BrandManagement", - "internationalBusiness:BusinessAnalytics", - "internationalBusiness:CorporateInnovation", - "internationalBusiness:EntrepreneurialStartups", - "internationalBusiness:FamilyBusiness", - "internationalBusiness:Finance", - "internationalBusiness:Fintech", - "internationalBusiness:HealthcareManagementAndConsulting", - "internationalBusiness:Management", - "internationalBusiness:ManagementInformationSystems", - "internationalBusiness:Marketing", - "internationalBusiness:MarketingAnalytics", - "internationalBusiness:SocialInnovationAndEntrepreneurship", - "internationalBusiness:SupplyChainManagement", - "journalism", - "landscapeArchitecture", - "linguistics", - "marineBiology", - "mathematics", - "mechanicalEngineering", - "mediaAndScreenStudies", - "mediaArts", - "music", - "musicTechnology", - "nursing", - "pharmaceuticalSciences", - "pharmacy(PharmD)", - "philosophy", - "physics", - "politicalScience", - "politicsPhilosophyEconomics", - "psychology", - "publicHealth", - "publicRelations", - "religiousStudies", - "sociology", - "spanish", - "speechLanguagePathologyAndAudiology", - "theatre" - ], - "allOf": [ - { - "$ref": "#/definitions/models.Major" - } - ] - }, - "major1": { - "maxLength": 255, - "enum": [ - "africanaStudies", - "americanSignLanguage", - "americanSignLanguage-EnglishInterpreting", - "appliedPhysics", - "architecturalStudies", - "architecture", - "art:ArtVisualStudies", - "behavioralNeuroscience", - "biochemistry", - "bioengineering", - "biology", - "biomedicalPhysics", - "businessAdministration", - "businessAdministration:Accounting", - "businessAdministration:AccountingAndAdvisoryServices", - "businessAdministration:BrandManagement", - "businessAdministration:BusinessAnalytics", - "businessAdministration:CorporateInnovation", - "businessAdministration:EntrepreneurialStartups", - "businessAdministration:FamilyBusiness", - "businessAdministration:Finance", - "businessAdministration:Fintech", - "businessAdministration:HealthcareManagementAndConsulting", - "businessAdministration:Management", - "businessAdministration:ManagementInformationSystems", - "businessAdministration:Marketing", - "businessAdministration:MarketingAnalytics", - "businessAdministration:SocialInnovationAndEntrepreneurship", - "businessAdministration:SupplyChainManagement", - "cellAndMolecularBiology", - "chemicalEngineering", - "chemistry", - "civilEngineering", - "communicationStudies", - "computerEngineering", - "computerScience", - "computingAndLaw", - "criminologyAndCriminalJustice", - "culturalAnthropology", - "cybersecurity", - "dataScience", - "design", - "economics", - "electricalEngineering", - "english", - "environmentalAndSustainabilityStudies", - "environmentalEngineering", - "environmentalScience", - "environmentalStudies", - "gameArtAndAnimation", - "gameDesign", - "globalAsianStudies", - "healthScience", - "history", - "historyCultureAndLaw", - "humanServices", - "industrialEngineering", - "internationalAffairs", - "internationalBusiness", - "internationalBusiness:Accounting", - "internationalBusiness:AccountingAndAdvisoryServices", - "internationalBusiness:BrandManagement", - "internationalBusiness:BusinessAnalytics", - "internationalBusiness:CorporateInnovation", - "internationalBusiness:EntrepreneurialStartups", - "internationalBusiness:FamilyBusiness", - "internationalBusiness:Finance", - "internationalBusiness:Fintech", - "internationalBusiness:HealthcareManagementAndConsulting", - "internationalBusiness:Management", - "internationalBusiness:ManagementInformationSystems", - "internationalBusiness:Marketing", - "internationalBusiness:MarketingAnalytics", - "internationalBusiness:SocialInnovationAndEntrepreneurship", - "internationalBusiness:SupplyChainManagement", - "journalism", - "landscapeArchitecture", - "linguistics", - "marineBiology", - "mathematics", - "mechanicalEngineering", - "mediaAndScreenStudies", - "mediaArts", - "music", - "musicTechnology", - "nursing", - "pharmaceuticalSciences", - "pharmacy(PharmD)", - "philosophy", - "physics", - "politicalScience", - "politicsPhilosophyEconomics", - "psychology", - "publicHealth", - "publicRelations", - "religiousStudies", - "sociology", - "spanish", - "speechLanguagePathologyAndAudiology", - "theatre" - ], - "allOf": [ - { - "$ref": "#/definitions/models.Major" - } - ] + "models.Major": { + "type": "string", + "enum": [ + "africanaStudies", + "americanSignLanguage", + "americanSignLanguage-EnglishInterpreting", + "appliedPhysics", + "architecturalStudies", + "architecture", + "art:ArtVisualStudies", + "behavioralNeuroscience", + "biochemistry", + "bioengineering", + "biology", + "biomedicalPhysics", + "businessAdministration", + "businessAdministration:Accounting", + "businessAdministration:AccountingAndAdvisoryServices", + "businessAdministration:BrandManagement", + "businessAdministration:BusinessAnalytics", + "businessAdministration:CorporateInnovation", + "businessAdministration:EntrepreneurialStartups", + "businessAdministration:FamilyBusiness", + "businessAdministration:Finance", + "businessAdministration:Fintech", + "businessAdministration:HealthcareManagementAndConsulting", + "businessAdministration:Management", + "businessAdministration:ManagementInformationSystems", + "businessAdministration:Marketing", + "businessAdministration:MarketingAnalytics", + "businessAdministration:SocialInnovationAndEntrepreneurship", + "businessAdministration:SupplyChainManagement", + "cellAndMolecularBiology", + "chemicalEngineering", + "chemistry", + "civilEngineering", + "communicationStudies", + "computerEngineering", + "computerScience", + "computingAndLaw", + "criminologyAndCriminalJustice", + "culturalAnthropology", + "cybersecurity", + "dataScience", + "design", + "economics", + "electricalEngineering", + "english", + "environmentalAndSustainabilityStudies", + "environmentalEngineering", + "environmentalScience", + "environmentalStudies", + "gameArtAndAnimation", + "gameDesign", + "globalAsianStudies", + "healthScience", + "history", + "historyCultureAndLaw", + "humanServices", + "industrialEngineering", + "internationalAffairs", + "internationalBusiness", + "internationalBusiness:Accounting", + "internationalBusiness:AccountingAndAdvisoryServices", + "internationalBusiness:BrandManagement", + "internationalBusiness:BusinessAnalytics", + "internationalBusiness:CorporateInnovation", + "internationalBusiness:EntrepreneurialStartups", + "internationalBusiness:FamilyBusiness", + "internationalBusiness:Finance", + "internationalBusiness:Fintech", + "internationalBusiness:HealthcareManagementAndConsulting", + "internationalBusiness:Management", + "internationalBusiness:ManagementInformationSystems", + "internationalBusiness:Marketing", + "internationalBusiness:MarketingAnalytics", + "internationalBusiness:SocialInnovationAndEntrepreneurship", + "internationalBusiness:SupplyChainManagement", + "journalism", + "landscapeArchitecture", + "linguistics", + "marineBiology", + "mathematics", + "mechanicalEngineering", + "mediaAndScreenStudies", + "mediaArts", + "music", + "musicTechnology", + "nursing", + "pharmaceuticalSciences", + "pharmacy(PharmD)", + "philosophy", + "physics", + "politicalScience", + "politicsPhilosophyEconomics", + "psychology", + "publicHealth", + "publicRelations", + "religiousStudies", + "sociology", + "spanish", + "speechLanguagePathologyAndAudiology", + "theatre" + ], + "x-enum-varnames": [ + "AfricanaStudies", + "AmericanSignLanguage", + "AmericanSignLanguageEnglishInterpreting", + "AppliedPhysics", + "ArchitecturalStudies", + "Architecture", + "ArtArtVisualStudies", + "BehavioralNeuroscience", + "Biochemistry", + "Bioengineering", + "Biology", + "BiomedicalPhysics", + "BusinessAdministration", + "BusinessAdministrationAccounting", + "BusinessAdministrationAccountingAndAdvisoryServices", + "BusinessAdministrationBrandManagement", + "BusinessAdministrationBusinessAnalytics", + "BusinessAdministrationCorporateInnovation", + "BusinessAdministrationEntrepreneurialStartups", + "BusinessAdministrationFamilyBusiness", + "BusinessAdministrationFinance", + "BusinessAdministrationFintech", + "BusinessAdministrationHealthcareManagementAndConsulting", + "BusinessAdministrationManagement", + "BusinessAdministrationManagementInformationSystems", + "BusinessAdministrationMarketing", + "BusinessAdministrationMarketingAnalytics", + "BusinessAdministrationSocialInnovationAndEntrepreneurship", + "BusinessAdministrationSupplyChainManagement", + "CellAndMolecularBiology", + "ChemicalEngineering", + "Chemistry", + "CivilEngineering", + "CommunicationStudies", + "ComputerEngineering", + "ComputerScience", + "ComputingAndLaw", + "CriminologyAndCriminalJustice", + "CulturalAnthropology", + "Cybersecurity", + "DataScience", + "Design", + "Economics", + "ElectricalEngineering", + "English", + "EnvironmentalAndSustainabilityStudies", + "EnvironmentalEngineering", + "EnvironmentalScience", + "EnvironmentalStudies", + "GameArtAndAnimation", + "GameDesign", + "GlobalAsianStudies", + "HealthScience", + "History", + "HistoryCultureAndLaw", + "HumanServices", + "IndustrialEngineering", + "InternationalAffairs", + "InternationalBusiness", + "InternationalBusinessAccounting", + "InternationalBusinessAccountingAndAdvisoryServices", + "InternationalBusinessBrandManagement", + "InternationalBusinessBusinessAnalytics", + "InternationalBusinessCorporateInnovation", + "InternationalBusinessEntrepreneurialStartups", + "InternationalBusinessFamilyBusiness", + "InternationalBusinessFinance", + "InternationalBusinessFintech", + "InternationalBusinessHealthcareManagementAndConsulting", + "InternationalBusinessManagement", + "InternationalBusinessManagementInformationSystems", + "InternationalBusinessMarketing", + "InternationalBusinessMarketingAnalytics", + "InternationalBusinessSocialInnovationAndEntrepreneurship", + "InternationalBusinessSupplyChainManagement", + "Journalism", + "LandscapeArchitecture", + "Linguistics", + "MarineBiology", + "Mathematics", + "MechanicalEngineering", + "MediaAndScreenStudies", + "MediaArts", + "Music", + "MusicTechnology", + "Nursing", + "PharmaceuticalSciences", + "PharmacyPharmD", + "Philosophy", + "Physics", + "PoliticalScience", + "PoliticsPhilosophyEconomics", + "Psychology", + "PublicHealth", + "PublicRelations", + "ReligiousStudies", + "Sociology", + "Spanish", + "SpeechLanguagePathologyAndAudiology", + "Theatre" + ] + }, + "models.PointOfContact": { + "type": "object", + "properties": { + "created_at": { + "type": "string", + "example": "2023-09-20T16:34:50Z" }, - "major2": { - "maxLength": 255, - "enum": [ - "africanaStudies", - "americanSignLanguage", - "americanSignLanguage-EnglishInterpreting", - "appliedPhysics", - "architecturalStudies", - "architecture", - "art:ArtVisualStudies", - "behavioralNeuroscience", - "biochemistry", - "bioengineering", - "biology", - "biomedicalPhysics", - "businessAdministration", - "businessAdministration:Accounting", - "businessAdministration:AccountingAndAdvisoryServices", - "businessAdministration:BrandManagement", - "businessAdministration:BusinessAnalytics", - "businessAdministration:CorporateInnovation", - "businessAdministration:EntrepreneurialStartups", - "businessAdministration:FamilyBusiness", - "businessAdministration:Finance", - "businessAdministration:Fintech", - "businessAdministration:HealthcareManagementAndConsulting", - "businessAdministration:Management", - "businessAdministration:ManagementInformationSystems", - "businessAdministration:Marketing", - "businessAdministration:MarketingAnalytics", - "businessAdministration:SocialInnovationAndEntrepreneurship", - "businessAdministration:SupplyChainManagement", - "cellAndMolecularBiology", - "chemicalEngineering", - "chemistry", - "civilEngineering", - "communicationStudies", - "computerEngineering", - "computerScience", - "computingAndLaw", - "criminologyAndCriminalJustice", - "culturalAnthropology", - "cybersecurity", - "dataScience", - "design", - "economics", - "electricalEngineering", - "english", - "environmentalAndSustainabilityStudies", - "environmentalEngineering", - "environmentalScience", - "environmentalStudies", - "gameArtAndAnimation", - "gameDesign", - "globalAsianStudies", - "healthScience", - "history", - "historyCultureAndLaw", - "humanServices", - "industrialEngineering", - "internationalAffairs", - "internationalBusiness", - "internationalBusiness:Accounting", - "internationalBusiness:AccountingAndAdvisoryServices", - "internationalBusiness:BrandManagement", - "internationalBusiness:BusinessAnalytics", - "internationalBusiness:CorporateInnovation", - "internationalBusiness:EntrepreneurialStartups", - "internationalBusiness:FamilyBusiness", - "internationalBusiness:Finance", - "internationalBusiness:Fintech", - "internationalBusiness:HealthcareManagementAndConsulting", - "internationalBusiness:Management", - "internationalBusiness:ManagementInformationSystems", - "internationalBusiness:Marketing", - "internationalBusiness:MarketingAnalytics", - "internationalBusiness:SocialInnovationAndEntrepreneurship", - "internationalBusiness:SupplyChainManagement", - "journalism", - "landscapeArchitecture", - "linguistics", - "marineBiology", - "mathematics", - "mechanicalEngineering", - "mediaAndScreenStudies", - "mediaArts", - "music", - "musicTechnology", - "nursing", - "pharmaceuticalSciences", - "pharmacy(PharmD)", - "philosophy", - "physics", - "politicalScience", - "politicsPhilosophyEconomics", - "psychology", - "publicHealth", - "publicRelations", - "religiousStudies", - "sociology", - "spanish", - "speechLanguagePathologyAndAudiology", - "theatre" - ], - "allOf": [ - { - "$ref": "#/definitions/models.Major" - } - ] + "email": { + "type": "string" }, - "role": { + "id": { "type": "string", - "enum": [ - "super", - "student" - ] + "example": "123e4567-e89b-12d3-a456-426614174000" + }, + "name": { + "type": "string" + }, + "photo_file": { + "$ref": "#/definitions/models.File" + }, + "position": { + "type": "string" }, "updated_at": { "type": "string", @@ -6069,43 +4846,122 @@ const docTemplate = `{ } } }, - "models.VerifyEmailRequestBody": { - "type": "object", - "required": [ - "email", - "token" + "models.RecruitmentCycle": { + "type": "string", + "enum": [ + "fall", + "spring", + "fallSpring", + "always" ], + "x-enum-varnames": [ + "Fall", + "Spring", + "FallSpring", + "Always" + ] + }, + "models.RecruitmentType": { + "type": "string", + "enum": [ + "unrestricted", + "tryout", + "application" + ], + "x-enum-varnames": [ + "Unrestricted", + "Tryout", + "Application" + ] + }, + "models.Tag": { + "type": "object", "properties": { - "email": { + "category_id": { "type": "string" }, - "token": { + "created_at": { + "type": "string", + "example": "2023-09-20T16:34:50Z" + }, + "id": { + "type": "string", + "example": "123e4567-e89b-12d3-a456-426614174000" + }, + "name": { "type": "string" + }, + "updated_at": { + "type": "string", + "example": "2023-09-20T16:34:50Z" } } }, - "models.VerifyPasswordResetTokenRequestBody": { + "models.User": { "type": "object", - "required": [ - "new_password", - "token", - "verify_new_password" - ], "properties": { - "new_password": { + "college": { + "$ref": "#/definitions/models.College" + }, + "created_at": { "type": "string", - "minLength": 8 + "example": "2023-09-20T16:34:50Z" }, - "token": { + "email": { "type": "string" }, - "verify_new_password": { + "first_name": { + "type": "string" + }, + "graduation_cycle": { + "$ref": "#/definitions/models.GraduationCycle" + }, + "graduation_year": { + "type": "integer" + }, + "id": { "type": "string", - "minLength": 8 + "example": "123e4567-e89b-12d3-a456-426614174000" + }, + "is_verified": { + "type": "boolean" + }, + "last_name": { + "type": "string" + }, + "major0": { + "$ref": "#/definitions/models.Major" + }, + "major1": { + "$ref": "#/definitions/models.Major" + }, + "major2": { + "$ref": "#/definitions/models.Major" + }, + "role": { + "type": "string" + }, + "updated_at": { + "type": "string", + "example": "2023-09-20T16:34:50Z" + } + } + }, + "tags.CreateClubTagsRequestBody": { + "type": "object", + "required": [ + "tags" + ], + "properties": { + "tags": { + "type": "array", + "items": { + "type": "string" + } } } }, - "tag.CreateUserTagsBody": { + "tags.CreateUserTagsBody": { "type": "object", "required": [ "tags" diff --git a/backend/docs/swagger.json b/backend/docs/swagger.json index 005552ea3..bbfe208db 100644 --- a/backend/docs/swagger.json +++ b/backend/docs/swagger.json @@ -1,5598 +1,4976 @@ { - "swagger": "2.0", - "info": { - "contact": {} - }, - "paths": { - "/auth/forgot-password": { - "post": { - "description": "Generates a password reset token", - "consumes": ["application/json"], - "produces": ["application/json"], - "tags": ["auth"], - "summary": "Generates a password reset token", - "operationId": "forgot-password", - "parameters": [ - { - "description": "Email", - "name": "email", - "in": "body", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/utilities.SuccessResponse" - } - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "429": { - "description": "Too Many Requests", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - } - }, - "/auth/login": { - "post": { - "description": "Logs in a user", - "consumes": ["application/json"], - "produces": ["application/json"], - "tags": ["auth"], - "summary": "Logs in a user", - "operationId": "login-user", - "parameters": [ - { - "description": "Login Body", - "name": "loginBody", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/models.LoginResponseBody" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/models.User" - } - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "404": { - "description": "Not Found", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - } - }, - "/auth/logout": { - "post": { - "description": "Logs out a user", - "consumes": ["application/json"], - "produces": ["application/json"], - "tags": ["auth"], - "summary": "Logs out a user", - "operationId": "logout-user", - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/utilities.SuccessResponse" - } - } - } - } - }, - "/auth/me": { - "get": { - "security": [ - { - "Bearer": [] - } - ], - "description": "Retrieves the currently authenticated user", - "consumes": ["application/json"], - "produces": ["application/json"], - "tags": ["auth"], - "summary": "Retrieves the currently authenticated user", - "operationId": "get-me", - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/models.User" - } - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "401": { - "description": "Unauthorized", - "schema": {} - }, - "404": { - "description": "Not Found", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - } - }, - "/auth/refresh": { - "post": { - "description": "Refreshes a user's access token", - "consumes": ["application/json"], - "produces": ["application/json"], - "tags": ["auth"], - "summary": "Refreshes a user's access token", - "operationId": "refresh-user", - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/utilities.SuccessResponse" - } - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "404": { - "description": "Not Found", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - } - }, - "/auth/send-code": { - "post": { - "description": "Sends a verification code", - "consumes": ["application/json"], - "produces": ["application/json"], - "tags": ["auth"], - "summary": "Sends a verification code", - "operationId": "send-verification-code", - "parameters": [ - { - "description": "Email", - "name": "email", - "in": "body", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/utilities.SuccessResponse" - } - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "429": { - "description": "Too Many Requests", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - } - }, - "/auth/verify-email": { - "post": { - "description": "Verifies an email", - "consumes": ["application/json"], - "produces": ["application/json"], - "tags": ["auth"], - "summary": "Verifies an email", - "operationId": "verify-email", - "parameters": [ - { - "description": "Email Verification Token Body", - "name": "tokenBody", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/models.VerifyEmailRequestBody" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/utilities.SuccessResponse" - } - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "429": { - "description": "Too Many Requests", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - } - }, - "/auth/verify-reset": { - "post": { - "security": [ - { - "Bearer": [] - } - ], - "description": "Verifies a password reset token", - "consumes": ["application/json"], - "produces": ["application/json"], - "tags": ["auth"], - "summary": "Verifies a password reset token", - "operationId": "verify-password-reset-token", - "parameters": [ - { - "description": "Password Reset Token Body", - "name": "tokenBody", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/models.VerifyPasswordResetTokenRequestBody" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/utilities.SuccessResponse" - } - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "429": { - "description": "Too Many Requests", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - } - }, - "/categories/": { - "get": { - "description": "Retrieves all categories", - "produces": ["application/json"], - "tags": ["category"], - "summary": "Retrieve all categories", - "operationId": "get-categories", - "parameters": [ - { - "type": "integer", - "description": "Limit", - "name": "limit", - "in": "query" - }, - { - "type": "integer", - "description": "Page", - "name": "page", - "in": "query" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/models.Category" - } - } - }, - "400": { - "description": "Bad Request", - "schema": { - "type": "string" - } - }, - "404": { - "description": "Not Found", - "schema": { - "type": "string" - } - }, - "500": { - "description": "Internal Server Error", - "schema": { - "type": "string" - } - } - } - }, - "post": { - "description": "Creates a category", - "consumes": ["application/json"], - "produces": ["application/json"], - "tags": ["category"], - "summary": "Creates a category", - "operationId": "create-category", - "parameters": [ - { - "description": "Category Body", - "name": "categoryBody", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/categories.CategoryRequestBody" - } - } - ], - "responses": { - "201": { - "description": "Created", - "schema": { - "$ref": "#/definitions/models.Category" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "type": "string" - } - }, - "401": { - "description": "Unauthorized", - "schema": { - "type": "string" - } - }, - "404": { - "description": "Not Found", - "schema": { - "type": "string" - } - }, - "409": { - "description": "Conflict", - "schema": { - "type": "string" - } - }, - "500": { - "description": "Internal Server Error", - "schema": { - "type": "string" - } - } - } - } - }, - "/categories/{categoryID}/": { - "get": { - "description": "Retrieves a category", - "produces": ["application/json"], - "tags": ["category"], - "summary": "Retrieve a category", - "operationId": "get-category", - "parameters": [ - { - "type": "string", - "description": "Category ID", - "name": "categoryID", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/models.Category" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "type": "string" - } - }, - "404": { - "description": "Not Found", - "schema": { - "type": "string" - } - }, - "500": { - "description": "Internal Server Error", - "schema": { - "type": "string" - } - } - } - }, - "delete": { - "description": "Deletes a category", - "produces": ["application/json"], - "tags": ["category"], - "summary": "Deletes a category", - "operationId": "delete-category", - "parameters": [ - { - "type": "string", - "description": "Category ID", - "name": "categoryID", - "in": "path", - "required": true - } - ], - "responses": { - "204": { - "description": "No Content", - "schema": { - "type": "string" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "type": "string" - } - }, - "401": { - "description": "Unauthorized", - "schema": { - "type": "string" - } - }, - "404": { - "description": "Not Found", - "schema": { - "type": "string" - } - }, - "500": { - "description": "Internal Server Error", - "schema": { - "type": "string" - } - } - } - }, - "patch": { - "description": "Updates a category", - "consumes": ["application/json"], - "produces": ["application/json"], - "tags": ["category"], - "summary": "Updates a category", - "operationId": "update-category", - "parameters": [ - { - "type": "string", - "description": "Category ID", - "name": "categoryID", - "in": "path", - "required": true - }, - { - "description": "Category Body", - "name": "categoryBody", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/categories.CategoryRequestBody" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/models.Category" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "type": "string" - } - }, - "401": { - "description": "Unauthorized", - "schema": { - "type": "string" - } - }, - "404": { - "description": "Not Found", - "schema": { - "type": "string" - } - }, - "500": { - "description": "Internal Server Error", - "schema": { - "type": "string" - } - } - } - } - }, - "/categories/{categoryID}/tags/": { - "get": { - "description": "Retrieves all tags associated with a category", - "produces": ["application/json"], - "tags": ["category-tag"], - "summary": "Retrieve all tags by category", - "operationId": "get-tags-by-category", - "parameters": [ - { - "type": "string", - "description": "Category ID", - "name": "categoryID", - "in": "path", - "required": true - }, - { - "type": "integer", - "description": "Limit", - "name": "limit", - "in": "query" - }, - { - "type": "integer", - "description": "Page", - "name": "page", - "in": "query" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/models.Tag" - } - } - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "404": { - "description": "Not Found", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - } - }, - "/categories/{categoryID}/tags/{tagID}/": { - "get": { - "description": "Retrieves a tag associated with a category", - "produces": ["application/json"], - "tags": ["category-tag"], - "summary": "Retrieve a tag by category", - "operationId": "get-tag-by-category", - "parameters": [ - { - "type": "string", - "description": "Category ID", - "name": "categoryID", - "in": "path", - "required": true - }, - { - "type": "string", - "description": "Tag ID", - "name": "tagID", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/models.Tag" - } - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "404": { - "description": "Not Found", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - } - }, - "/clubs/": { - "get": { - "description": "Retrieves all clubs", - "produces": ["application/json"], - "tags": ["club"], - "summary": "Retrieve all clubs", - "operationId": "get-all-clubs", - "parameters": [ - { - "type": "integer", - "description": "Limit", - "name": "limit", - "in": "query" - }, - { - "type": "integer", - "description": "Page", - "name": "page", - "in": "query" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/models.Club" - } - } - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - }, - "post": { - "description": "Creates a club", - "consumes": ["application/json"], - "produces": ["application/json"], - "tags": ["club"], - "summary": "Create a club", - "operationId": "create-club", - "parameters": [ - { - "description": "Club", - "name": "club", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/CreateClubRequestBody" - } - } - ], - "responses": { - "201": { - "description": "Created", - "schema": { - "$ref": "#/definitions/models.Club" - } - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "401": { - "description": "Unauthorized", - "schema": {} - }, - "404": { - "description": "Not Found", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - } - }, - "/clubs/{clubID}/": { - "get": { - "description": "Retrieves a club", - "produces": ["application/json"], - "tags": ["club"], - "summary": "Retrieve a club", - "operationId": "get-club", - "parameters": [ - { - "type": "string", - "description": "Club ID", - "name": "clubID", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/models.Club" - } - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "404": { - "description": "Not Found", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - }, - "delete": { - "description": "Deletes a club", - "produces": ["application/json"], - "tags": ["club"], - "summary": "Delete a club", - "operationId": "delete-club", - "parameters": [ - { - "type": "string", - "description": "Club ID", - "name": "clubID", - "in": "path", - "required": true - } - ], - "responses": { - "204": { - "description": "No Content", - "schema": { - "type": "string" - } - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "401": { - "description": "Unauthorized", - "schema": {} - }, - "404": { - "description": "Not Found", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - }, - "patch": { - "description": "Updates a club", - "consumes": ["application/json"], - "produces": ["application/json"], - "tags": ["club"], - "summary": "Update a club", - "operationId": "update-club", - "parameters": [ - { - "type": "string", - "description": "Club ID", - "name": "clubID", - "in": "path", - "required": true - }, - { - "description": "Club", - "name": "club", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/UpdateClubRequestBody" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/models.Club" - } - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "401": { - "description": "Unauthorized", - "schema": {} - }, - "404": { - "description": "Not Found", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - } - }, - "/clubs/{clubID}/contacts/": { - "get": { - "description": "Retrieves all contacts associated with a club", - "produces": ["application/json"], - "tags": ["club-contact"], - "summary": "Retrieve all contacts for a club", - "operationId": "get-contacts-by-club", - "parameters": [ - { - "type": "string", - "description": "Club ID", - "name": "clubID", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/models.Contact" - } - } - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "404": { - "description": "Not Found", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - }, - "put": { - "description": "Creates a contact", - "consumes": ["application/json"], - "produces": ["application/json"], - "tags": ["club-contact"], - "summary": "Creates a contact", - "operationId": "put-contact", - "parameters": [ - { - "type": "string", - "description": "Club ID", - "name": "clubID", - "in": "path", - "required": true - }, - { - "description": "Contact Body", - "name": "contactBody", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/PutContactRequestBody" - } - } - ], - "responses": { - "201": { - "description": "Created", - "schema": { - "$ref": "#/definitions/models.Contact" - } - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "401": { - "description": "Unauthorized", - "schema": {} - }, - "404": { - "description": "Not Found", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - } - }, - "/clubs/{clubID}/events/": { - "get": { - "description": "Retrieves all events associated with a club", - "produces": ["application/json"], - "tags": ["club-event"], - "summary": "Retrieve all events for a club", - "operationId": "get-events-by-club", - "parameters": [ - { - "type": "string", - "description": "Club ID", - "name": "clubID", - "in": "path", - "required": true - }, - { - "type": "integer", - "description": "Limit", - "name": "limit", - "in": "query" - }, - { - "type": "integer", - "description": "Page", - "name": "page", - "in": "query" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/models.Event" - } - } - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "404": { - "description": "Not Found", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - } - }, - "/clubs/{clubID}/followers/": { - "get": { - "description": "Retrieves all followers associated with a club", - "produces": ["application/json"], - "tags": ["club-follower"], - "summary": "Retrieve all followers for a club", - "operationId": "get-followers-by-club", - "parameters": [ - { - "type": "string", - "description": "Club ID", - "name": "clubID", - "in": "path", - "required": true - }, - { - "type": "integer", - "description": "Limit", - "name": "limit", - "in": "query" - }, - { - "type": "integer", - "description": "Page", - "name": "page", - "in": "query" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/models.User" - } - } - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "404": { - "description": "Not Found", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - } - }, - "/clubs/{clubID}/members/": { - "get": { - "description": "Retrieves all members associated with a club", - "produces": ["application/json"], - "tags": ["club-member"], - "summary": "Retrieve all members for a club", - "operationId": "get-members-by-club", - "parameters": [ - { - "type": "string", - "description": "Club ID", - "name": "clubID", - "in": "path", - "required": true - }, - { - "type": "integer", - "description": "Limit", - "name": "limit", - "in": "query" - }, - { - "type": "integer", - "description": "Page", - "name": "page", - "in": "query" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/models.User" - } - } - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "401": { - "description": "Unauthorized", - "schema": {} - }, - "404": { - "description": "Not Found", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - }, - "post": { - "description": "Creates a new member associated with a club", - "consumes": ["application/json"], - "produces": ["application/json"], - "tags": ["club-member"], - "summary": "Create a new member for a club", - "operationId": "create-member-for-club", - "parameters": [ - { - "type": "string", - "description": "Club ID", - "name": "clubID", - "in": "path", - "required": true - }, - { - "type": "string", - "description": "User ID", - "name": "userID", - "in": "path", - "required": true - } - ], - "responses": { - "201": { - "description": "Created", - "schema": { - "$ref": "#/definitions/models.User" - } - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "401": { - "description": "Unauthorized", - "schema": {} - }, - "404": { - "description": "Not Found", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - }, - "delete": { - "description": "Deletes a member associated with a club", - "produces": ["application/json"], - "tags": ["club-member"], - "summary": "Delete a member from a club", - "operationId": "delete-member-from-club", - "parameters": [ - { - "type": "string", - "description": "Club ID", - "name": "clubID", - "in": "path", - "required": true - }, - { - "type": "string", - "description": "User ID", - "name": "userID", - "in": "path", - "required": true - } - ], - "responses": { - "204": { - "description": "No Content", - "schema": { - "$ref": "#/definitions/models.User" - } - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "401": { - "description": "Unauthorized", - "schema": {} - }, - "404": { - "description": "Not Found", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - } - }, - "/clubs/{clubID}/poc/": { - "post": { - "description": "Creates a point of contact associated with a club", - "consumes": ["multipart/form-data"], - "produces": ["application/json"], - "tags": ["club-point-of-contact"], - "summary": "Create a point of contact for a club", - "operationId": "create-point-of-contact-by-club", - "parameters": [ - { - "type": "string", - "description": "Club ID", - "name": "clubID", - "in": "path", - "required": true - } - ], - "responses": { - "201": { - "description": "Created", - "schema": { - "$ref": "#/definitions/models.PointOfContact" - } - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "401": { - "description": "Unauthorized", - "schema": {} - }, - "404": { - "description": "Not Found", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - } - }, - "/clubs/{clubID}/poc/{pocID}": { - "put": { - "description": "Updates a point of contact associated with a club", - "consumes": ["application/json"], - "produces": ["application/json"], - "tags": ["club-point-of-contact"], - "summary": "Update a point of contact for a club", - "operationId": "update-point-of-contact-by-club", - "parameters": [ - { - "type": "string", - "description": "Club ID", - "name": "clubID", - "in": "path", - "required": true - }, - { - "type": "string", - "description": "Point of Contact ID", - "name": "pocID", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/models.PointOfContact" - } - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "401": { - "description": "Unauthorized", - "schema": {} - }, - "404": { - "description": "Not Found", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - }, - "delete": { - "description": "Delete a point of contact associated with a club", - "produces": ["application/json"], - "tags": ["club-point-of-contact"], - "summary": "Delete a point of contact for a club", - "operationId": "delete-point-of-contact-by-club", - "parameters": [ - { - "type": "string", - "description": "Club ID", - "name": "clubID", - "in": "path", - "required": true - }, - { - "type": "string", - "description": "Point of Contact ID", - "name": "pocID", - "in": "path", - "required": true - } - ], - "responses": { - "204": { - "description": "No Content" - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "404": { - "description": "Not Found", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - }, - "patch": { - "description": "Updates a point of contact photo associated with a club", - "consumes": ["multipart/form-data"], - "produces": ["application/json"], - "tags": ["club-point-of-contact"], - "summary": "Update a point of contact photo for a club", - "operationId": "update-point-of-contact-photo-by-club", - "parameters": [ - { - "type": "string", - "description": "Club ID", - "name": "clubID", - "in": "path", - "required": true - }, - { - "type": "string", - "description": "Point of Contact ID", - "name": "pocID", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/models.PointOfContact" - } - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "401": { - "description": "Unauthorized", - "schema": {} - }, - "404": { - "description": "Not Found", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - } - }, - "/clubs/{clubID}/pocs/": { - "get": { - "description": "Retrieves all point of contacts associated with a club", - "produces": ["application/json"], - "tags": ["club-point-of-contact"], - "summary": "Retrieve all point of contacts for a club", - "operationId": "get-point-of-contacts-by-club", - "parameters": [ - { - "type": "string", - "description": "Club ID", - "name": "clubID", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/models.PointOfContact" - } - } - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "404": { - "description": "Not Found", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - } - }, - "/clubs/{clubID}/pocs/{pocID}": { - "get": { - "description": "Retrieves a point of contact associated with a club", - "produces": ["application/json"], - "tags": ["club-point-of-contact"], - "summary": "Retrieve a point of contact for a club", - "operationId": "get-point-of-contact-by-club", - "parameters": [ - { - "type": "string", - "description": "Club ID", - "name": "clubID", - "in": "path", - "required": true - }, - { - "type": "string", - "description": "Point of Contact ID", - "name": "pocID", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/models.PointOfContact" - } - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "404": { - "description": "Not Found", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - } - }, - "/clubs/{clubID}/tags/": { - "get": { - "description": "Retrieves all tags associated with a club", - "produces": ["application/json"], - "tags": ["club-tag"], - "summary": "Retrieve all tags for a club", - "operationId": "get-tags-by-club", - "parameters": [ - { - "type": "string", - "description": "Club ID", - "name": "clubID", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/models.Tag" - } - } - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "404": { - "description": "Not Found", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - }, - "post": { - "description": "Creates tags for a club", - "consumes": ["application/json"], - "produces": ["application/json"], - "tags": ["club-tag"], - "summary": "Create club tags", - "operationId": "create-club-tags", - "parameters": [ - { - "type": "string", - "description": "Club ID", - "name": "clubID", - "in": "path", - "required": true - }, - { - "description": "Club Tags Body", - "name": "clubTagsBody", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/CreateClubTagsRequestBody" - } - } - ], - "responses": { - "201": { - "description": "Created", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/models.Tag" - } - } - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "401": { - "description": "Unauthorized", - "schema": {} - }, - "404": { - "description": "Not Found", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - } - }, - "/clubs/{clubID}/tags/{tagID}/": { - "delete": { - "description": "Deletes a tag associated with a club", - "produces": ["application/json"], - "tags": ["club-tag"], - "summary": "Delete a tag for a club", - "operationId": "delete-tag-by-club", - "parameters": [ - { - "type": "string", - "description": "Club ID", - "name": "clubID", - "in": "path", - "required": true - }, - { - "type": "string", - "description": "Tag ID", - "name": "tagID", - "in": "path", - "required": true - } - ], - "responses": { - "204": { - "description": "No Content", - "schema": { - "type": "string" - } - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "401": { - "description": "Unauthorized", - "schema": {} - }, - "404": { - "description": "Not Found", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - } - }, - "/contacts/": { - "get": { - "description": "Retrieves all contacts", - "produces": ["application/json"], - "tags": ["contact"], - "summary": "Retrieve all contacts", - "operationId": "get-contacts", - "parameters": [ - { - "type": "integer", - "description": "Limit", - "name": "limit", - "in": "query" - }, - { - "type": "integer", - "description": "Page", - "name": "page", - "in": "query" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/models.Contact" - } - } - }, - "400": { - "description": "Bad Request", - "schema": { - "type": "string" - } - }, - "404": { - "description": "Not Found", - "schema": { - "type": "string" - } - }, - "500": { - "description": "Internal Server Error", - "schema": { - "type": "string" - } - } - } - } - }, - "/contacts/{contactID}/": { - "get": { - "description": "Retrieves a contact by id", - "consumes": ["application/json"], - "produces": ["application/json"], - "tags": ["contact"], - "summary": "Retrieves a contact", - "operationId": "get-contact", - "parameters": [ - { - "type": "string", - "description": "Contact ID", - "name": "contactID", - "in": "path", - "required": true - } - ], - "responses": { - "201": { - "description": "Created", - "schema": { - "$ref": "#/definitions/models.Contact" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "type": "string" - } - }, - "404": { - "description": "Not Found", - "schema": { - "type": "string" - } - }, - "500": { - "description": "Internal Server Error", - "schema": { - "type": "string" - } - } - } - }, - "delete": { - "description": "Deletes a contact", - "consumes": ["application/json"], - "produces": ["application/json"], - "tags": ["contact"], - "summary": "Deletes a contact", - "operationId": "delete-contact", - "parameters": [ - { - "type": "string", - "description": "Contact ID", - "name": "contactID", - "in": "path", - "required": true - } - ], - "responses": { - "201": { - "description": "Created", - "schema": { - "$ref": "#/definitions/models.Contact" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "type": "string" - } - }, - "404": { - "description": "Not Found", - "schema": { - "type": "string" - } - }, - "500": { - "description": "Internal Server Error", - "schema": { - "type": "string" - } - } - } - } - }, - "/events/": { - "get": { - "description": "Retrieves all events", - "produces": ["application/json"], - "tags": ["event"], - "summary": "Retrieve all events", - "operationId": "get-all-events", - "parameters": [ - { - "type": "integer", - "description": "Limit", - "name": "limit", - "in": "query" - }, - { - "type": "integer", - "description": "Page", - "name": "page", - "in": "query" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/models.Event" - } - } - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "404": { - "description": "Not Found", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - }, - "post": { - "description": "Creates an event", - "consumes": ["application/json"], - "produces": ["application/json"], - "tags": ["event"], - "summary": "Create an event", - "operationId": "create-event", - "parameters": [ - { - "description": "Event Body", - "name": "event", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/events.CreateEventRequestBody" - } - } - ], - "responses": { - "201": { - "description": "Created", - "schema": { - "$ref": "#/definitions/models.Event" - } - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "401": { - "description": "Unauthorized", - "schema": {} - }, - "404": { - "description": "Not Found", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - } - }, - "/events/{eventID}/": { - "get": { - "description": "Retrieves an event", - "produces": ["application/json"], - "tags": ["event"], - "summary": "Retrieve an event", - "operationId": "get-event", - "parameters": [ - { - "type": "string", - "description": "Event ID", - "name": "eventID", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/models.Event" - } - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "404": { - "description": "Not Found", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - }, - "delete": { - "description": "Deletes an event", - "produces": ["application/json"], - "tags": ["event"], - "summary": "Delete an event", - "operationId": "delete-event", - "parameters": [ - { - "type": "string", - "description": "Event ID", - "name": "eventID", - "in": "path", - "required": true - } - ], - "responses": { - "204": { - "description": "No Content", - "schema": { - "type": "string" - } - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "401": { - "description": "Unauthorized", - "schema": {} - }, - "404": { - "description": "Not Found", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - } - }, - "/events/{eventID}/hosts": { - "get": { - "description": "Retrieves all hosts associated with an event", - "produces": ["application/json"], - "tags": ["event"], - "summary": "Retrieve all hosts by event", - "operationId": "get-hosts-by-event", - "parameters": [ - { - "type": "string", - "description": "Event ID", - "name": "eventID", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/models.Club" - } - } - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "404": { - "description": "Not Found", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - } - }, - "/events/{eventID}/series/": { - "get": { - "description": "Retrieves all series associated with an event", - "produces": ["application/json"], - "tags": ["event"], - "summary": "Retrieve all series by event", - "operationId": "get-series-by-event", - "parameters": [ - { - "type": "string", - "description": "Event ID", - "name": "eventID", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/models.Series" - } - } - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "404": { - "description": "Not Found", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - }, - "delete": { - "description": "Deletes all series associated with an event", - "produces": ["application/json"], - "tags": ["event"], - "summary": "Delete all series by event", - "operationId": "delete-series-by-event", - "parameters": [ - { - "type": "string", - "description": "Event ID", - "name": "eventID", - "in": "path", - "required": true - } - ], - "responses": { - "204": { - "description": "No Content", - "schema": { - "type": "string" - } - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "401": { - "description": "Unauthorized", - "schema": {} - }, - "404": { - "description": "Not Found", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - }, - "patch": { - "description": "Creates a series", - "consumes": ["application/json"], - "produces": ["application/json"], - "tags": ["event"], - "summary": "Create a series", - "operationId": "create-series", - "parameters": [ - { - "type": "string", - "description": "Event ID", - "name": "eventID", - "in": "path", - "required": true - }, - { - "description": "Series Body", - "name": "seriesBody", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/events.UpdateEventRequestBody" - } - } - ], - "responses": { - "201": { - "description": "Created", - "schema": { - "$ref": "#/definitions/models.Series" - } - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "401": { - "description": "Unauthorized", - "schema": {} - }, - "404": { - "description": "Not Found", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - } - }, - "/events/{eventID}/series/{seriesID}/": { - "get": { - "description": "Retrieves a series by ID", - "produces": ["application/json"], - "tags": ["event"], - "summary": "Retrieve a series by ID", - "operationId": "get-series-by-id", - "parameters": [ - { - "type": "string", - "description": "Event ID", - "name": "eventID", - "in": "path", - "required": true - }, - { - "type": "string", - "description": "Series ID", - "name": "seriesID", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/models.Series" - } - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "404": { - "description": "Not Found", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - }, - "delete": { - "description": "Deletes a series by ID", - "produces": ["application/json"], - "tags": ["event"], - "summary": "Delete a series by ID", - "operationId": "delete-series-by-id", - "parameters": [ - { - "type": "string", - "description": "Event ID", - "name": "eventID", - "in": "path", - "required": true - }, - { - "type": "string", - "description": "Series ID", - "name": "seriesID", - "in": "path", - "required": true - } - ], - "responses": { - "204": { - "description": "No Content", - "schema": { - "type": "string" - } - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "401": { - "description": "Unauthorized", - "schema": {} - }, - "404": { - "description": "Not Found", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - }, - "patch": { - "description": "Updates a series by event ID", - "consumes": ["application/json"], - "produces": ["application/json"], - "tags": ["event"], - "summary": "Update a series by event ID", - "operationId": "update-series-by-event-id", - "parameters": [ - { - "type": "string", - "description": "Event ID", - "name": "eventID", - "in": "path", - "required": true - }, - { - "description": "Series Body", - "name": "seriesBody", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/models.UpdateSeriesRequestBody" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/models.Series" - } - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "401": { - "description": "Unauthorized", - "schema": {} - }, - "404": { - "description": "Not Found", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - } - }, - "/events/{eventID}/tags": { - "get": { - "description": "Retrieves all tags associated with an event", - "produces": ["application/json"], - "tags": ["event"], - "summary": "Retrieve all tags by event", - "operationId": "get-tags-by-event", - "parameters": [ - { - "type": "string", - "description": "Event ID", - "name": "eventID", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/models.Tag" - } - } - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "404": { - "description": "Not Found", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - } - }, - "/files/": { - "get": { - "description": "Retrieves all files", - "produces": ["application/json"], - "tags": ["file"], - "summary": "Retrieve all files", - "operationId": "get-files", - "parameters": [ - { - "type": "integer", - "description": "Limit", - "name": "limit", - "in": "query" - }, - { - "type": "integer", - "description": "Page", - "name": "page", - "in": "query" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/models.File" - } - } - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "401": { - "description": "Unauthorized", - "schema": {} - }, - "404": { - "description": "Not Found", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - }, - "post": { - "description": "Creates a file", - "consumes": ["multipart/form-data"], - "produces": ["application/json"], - "tags": ["file"], - "summary": "Create a file", - "operationId": "create-file", - "parameters": [ - { - "description": "File", - "name": "file", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/CreateFileRequestBody" - } - } - ], - "responses": { - "201": { - "description": "Created", - "schema": { - "$ref": "#/definitions/models.File" - } - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "401": { - "description": "Unauthorized", - "schema": {} - }, - "404": { - "description": "Not Found", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - } - }, - "/files/:fileID": { - "get": { - "description": "Retrieves a file", - "produces": ["application/json"], - "tags": ["file"], - "summary": "Retrieve a file", - "operationId": "get-file", - "parameters": [ - { - "type": "string", - "description": "File ID", - "name": "fileID", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/models.File" - } - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "401": { - "description": "Unauthorized", - "schema": {} - }, - "404": { - "description": "Not Found", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - }, - "delete": { - "description": "Deletes a file", - "produces": ["application/json"], - "tags": ["file"], - "summary": "Delete a file", - "operationId": "delete-file", - "parameters": [ - { - "type": "string", - "description": "File ID", - "name": "fileID", - "in": "path", - "required": true - } - ], - "responses": { - "201": { - "description": "Created", - "schema": { - "$ref": "#/definitions/models.File" - } - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "401": { - "description": "Unauthorized", - "schema": {} - }, - "404": { - "description": "Not Found", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - } - }, - "/pocs/": { - "get": { - "description": "Retrieves all point of contacts", - "produces": ["application/json"], - "tags": ["point of contact"], - "summary": "Retrieve all point of contacts", - "operationId": "get-point-of-contacts", - "parameters": [ - { - "type": "integer", - "description": "Limit", - "name": "limit", - "in": "query" - }, - { - "type": "integer", - "description": "Page", - "name": "page", - "in": "query" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/models.PointOfContact" - } - } - }, - "400": { - "description": "Bad Request", - "schema": { - "type": "string" - } - }, - "404": { - "description": "Not Found", - "schema": { - "type": "string" - } - }, - "500": { - "description": "Internal Server Error", - "schema": { - "type": "string" - } - } - } - } - }, - "/pocs/{pocID}/": { - "get": { - "description": "Retrieves a point of contact by id", - "produces": ["application/json"], - "tags": ["point of contact"], - "summary": "Retrieves a point of contact", - "operationId": "get-point-of-contact", - "parameters": [ - { - "type": "string", - "description": "Point of Contact ID", - "name": "pocID", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/models.PointOfContact" - } - }, - "400": { - "description": "Bad Request", - "schema": { - "type": "string" - } - }, - "404": { - "description": "Not Found", - "schema": { - "type": "string" - } - }, - "500": { - "description": "Internal Server Error", - "schema": { - "type": "string" - } - } - } - } - }, - "/tags": { - "get": { - "description": "Retrieves all tags", - "produces": ["application/json"], - "tags": ["tag"], - "summary": "Retrieve all tags", - "operationId": "get-all-tags", - "parameters": [ - { - "type": "integer", - "description": "Limit", - "name": "limit", - "in": "query" - }, - { - "type": "integer", - "description": "Page", - "name": "page", - "in": "query" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/models.Tag" - } - } - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "404": { - "description": "Not Found", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - } - }, - "/tags/": { - "post": { - "description": "Creates a tag", - "consumes": ["application/json"], - "produces": ["application/json"], - "tags": ["tag"], - "summary": "Create a tag", - "operationId": "create-tag", - "parameters": [ - { - "description": "Tag Body", - "name": "tagBody", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/CreateTagRequestBody" - } - } - ], - "responses": { - "201": { - "description": "Created", - "schema": { - "$ref": "#/definitions/models.Tag" - } - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "401": { - "description": "Unauthorized", - "schema": {} - }, - "404": { - "description": "Not Found", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - } - }, - "/tags/{tagID}/": { - "get": { - "description": "Retrieves a tag", - "produces": ["application/json"], - "tags": ["tag"], - "summary": "Retrieve a tag", - "operationId": "get-tag", - "parameters": [ - { - "type": "string", - "description": "Tag ID", - "name": "tagID", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/models.Tag" - } - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "404": { - "description": "Not Found", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - }, - "delete": { - "description": "Deletes a tag", - "produces": ["application/json"], - "tags": ["tag"], - "summary": "Delete a tag", - "operationId": "delete-tag", - "parameters": [ - { - "type": "string", - "description": "Tag ID", - "name": "tagID", - "in": "path", - "required": true - } - ], - "responses": { - "204": { - "description": "No Content", - "schema": { - "type": "string" - } - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "401": { - "description": "Unauthorized", - "schema": {} - }, - "404": { - "description": "Not Found", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - }, - "patch": { - "description": "Updates a tag", - "consumes": ["application/json"], - "produces": ["application/json"], - "tags": ["tag"], - "summary": "Update a tag", - "operationId": "update-tag", - "parameters": [ - { - "type": "string", - "description": "Tag ID", - "name": "tagID", - "in": "path", - "required": true - }, - { - "description": "Tag", - "name": "tag", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/UpdateTagRequestBody" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/models.Tag" - } - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "401": { - "description": "Unauthorized", - "schema": {} - }, - "404": { - "description": "Not Found", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - } - }, - "/users/": { - "get": { - "description": "Retrieves all users", - "produces": ["application/json"], - "tags": ["user"], - "summary": "Retrieve all users", - "operationId": "get-users", - "parameters": [ - { - "type": "integer", - "description": "Limit", - "name": "limit", - "in": "query" - }, - { - "type": "integer", - "description": "Page", - "name": "page", - "in": "query" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/models.User" - } - } - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "401": { - "description": "Unauthorized", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - }, - "post": { - "description": "Creates a user", - "consumes": ["application/json"], - "produces": ["application/json"], - "tags": ["user"], - "summary": "Create a user", - "operationId": "create-user", - "parameters": [ - { - "description": "User Body", - "name": "userBody", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/CreateUserRequestBody" - } - } - ], - "responses": { - "201": { - "description": "Created", - "schema": { - "$ref": "#/definitions/models.User" - } - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "401": { - "description": "Unauthorized", - "schema": {} - }, - "404": { - "description": "Not Found", - "schema": {} - }, - "409": { - "description": "Conflict", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - } + "swagger": "2.0", + "info": { + "contact": {} }, - "/users/{userID}/": { - "get": { - "description": "Retrieves a user", - "produces": ["application/json"], - "tags": ["user"], - "summary": "Retrieve a user", - "operationId": "get-user", - "parameters": [ - { - "type": "string", - "description": "User ID", - "name": "userID", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/models.User" - } - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "401": { - "description": "Unauthorized", - "schema": {} - }, - "404": { - "description": "Not Found", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - }, - "delete": { - "description": "Deletes a user", - "produces": ["application/json"], - "tags": ["user"], - "summary": "Delete a user", - "operationId": "delete-user", - "parameters": [ - { - "type": "string", - "description": "User ID", - "name": "userID", - "in": "path", - "required": true - } - ], - "responses": { - "204": { - "description": "No Content", - "schema": { - "type": "string" - } - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "401": { - "description": "Unauthorized", - "schema": {} - }, - "404": { - "description": "Not Found", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - }, - "patch": { - "description": "Updates a user", - "consumes": ["application/json"], - "produces": ["application/json"], - "tags": ["user"], - "summary": "Update a user", - "operationId": "update-user", - "parameters": [ - { - "type": "string", - "description": "User ID", - "name": "userID", - "in": "path", - "required": true - }, - { - "description": "User Body", - "name": "userBody", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/UpdateUserRequestBody" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/models.User" + "paths": { + "/auth/forgot-password": { + "post": { + "description": "Generates a password reset token", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "auth" + ], + "summary": "Generates a password reset token", + "operationId": "forgot-password", + "parameters": [ + { + "description": "Email", + "name": "email", + "in": "body", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/utilities.SuccessResponse" + } + }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "429": { + "description": "Too Many Requests", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} + } + } + } + }, + "/auth/login": { + "post": { + "description": "Logs in a user", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "auth" + ], + "summary": "Logs in a user", + "operationId": "login-user", + "parameters": [ + { + "description": "Login Body", + "name": "loginBody", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/auth.LoginResponseBody" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/models.User" + } + }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "404": { + "description": "Not Found", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} + } + } + } + }, + "/auth/logout": { + "post": { + "description": "Logs out a user", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "auth" + ], + "summary": "Logs out a user", + "operationId": "logout-user", + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/utilities.SuccessResponse" + } + } + } + } + }, + "/auth/me": { + "get": { + "security": [ + { + "Bearer": [] + } + ], + "description": "Retrieves the currently authenticated user", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "auth" + ], + "summary": "Retrieves the currently authenticated user", + "operationId": "get-me", + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/models.User" + } + }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "401": { + "description": "Unauthorized", + "schema": {} + }, + "404": { + "description": "Not Found", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} + } + } + } + }, + "/auth/refresh": { + "post": { + "description": "Refreshes a user's access token", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "auth" + ], + "summary": "Refreshes a user's access token", + "operationId": "refresh-user", + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/utilities.SuccessResponse" + } + }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "404": { + "description": "Not Found", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} + } + } + } + }, + "/auth/register": { + "post": { + "description": "Registers a user", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "auth" + ], + "summary": "Registers a user", + "operationId": "register-user", + "parameters": [ + { + "description": "User Body", + "name": "userBody", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/base.CreateUserRequestBody" + } + } + ], + "responses": { + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/models.User" + } + }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "404": { + "description": "Not Found", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} + } + } + } + }, + "/auth/send-code": { + "post": { + "description": "Sends a verification code", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "auth" + ], + "summary": "Sends a verification code", + "operationId": "send-verification-code", + "parameters": [ + { + "description": "Email", + "name": "email", + "in": "body", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/utilities.SuccessResponse" + } + }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "429": { + "description": "Too Many Requests", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} + } + } + } + }, + "/auth/verify-email": { + "post": { + "description": "Verifies an email", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "auth" + ], + "summary": "Verifies an email", + "operationId": "verify-email", + "parameters": [ + { + "description": "Email Verification Token Body", + "name": "tokenBody", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/base.VerifyEmailRequestBody" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/utilities.SuccessResponse" + } + }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "429": { + "description": "Too Many Requests", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} + } + } + } + }, + "/auth/verify-reset": { + "post": { + "security": [ + { + "Bearer": [] + } + ], + "description": "Verifies a password reset token", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "auth" + ], + "summary": "Verifies a password reset token", + "operationId": "verify-password-reset-token", + "parameters": [ + { + "description": "Password Reset Token Body", + "name": "tokenBody", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/base.VerifyPasswordResetTokenRequestBody" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/utilities.SuccessResponse" + } + }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "429": { + "description": "Too Many Requests", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} + } + } + } + }, + "/categories/": { + "get": { + "description": "Retrieves all categories", + "produces": [ + "application/json" + ], + "tags": [ + "category" + ], + "summary": "Retrieve all categories", + "operationId": "get-categories", + "parameters": [ + { + "type": "integer", + "description": "Limit", + "name": "limit", + "in": "query" + }, + { + "type": "integer", + "description": "Page", + "name": "page", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/models.Category" + } + } + }, + "400": { + "description": "Bad Request", + "schema": { + "type": "string" + } + }, + "404": { + "description": "Not Found", + "schema": { + "type": "string" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "type": "string" + } + } + } + }, + "post": { + "description": "Creates a category", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "category" + ], + "summary": "Creates a category", + "operationId": "create-category", + "parameters": [ + { + "description": "Category Body", + "name": "categoryBody", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/categories.CategoryRequestBody" + } + } + ], + "responses": { + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/models.Category" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "type": "string" + } + }, + "401": { + "description": "Unauthorized", + "schema": { + "type": "string" + } + }, + "404": { + "description": "Not Found", + "schema": { + "type": "string" + } + }, + "409": { + "description": "Conflict", + "schema": { + "type": "string" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "type": "string" + } + } + } + } + }, + "/categories/{categoryID}/": { + "get": { + "description": "Retrieves a category", + "produces": [ + "application/json" + ], + "tags": [ + "category" + ], + "summary": "Retrieve a category", + "operationId": "get-category", + "parameters": [ + { + "type": "string", + "description": "Category ID", + "name": "categoryID", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/models.Category" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "type": "string" + } + }, + "404": { + "description": "Not Found", + "schema": { + "type": "string" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "type": "string" + } + } + } + }, + "delete": { + "description": "Deletes a category", + "produces": [ + "application/json" + ], + "tags": [ + "category" + ], + "summary": "Deletes a category", + "operationId": "delete-category", + "parameters": [ + { + "type": "string", + "description": "Category ID", + "name": "categoryID", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "description": "No Content", + "schema": { + "type": "string" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "type": "string" + } + }, + "401": { + "description": "Unauthorized", + "schema": { + "type": "string" + } + }, + "404": { + "description": "Not Found", + "schema": { + "type": "string" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "type": "string" + } + } + } + }, + "patch": { + "description": "Updates a category", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "category" + ], + "summary": "Updates a category", + "operationId": "update-category", + "parameters": [ + { + "type": "string", + "description": "Category ID", + "name": "categoryID", + "in": "path", + "required": true + }, + { + "description": "Category Body", + "name": "categoryBody", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/categories.CategoryRequestBody" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/models.Category" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "type": "string" + } + }, + "401": { + "description": "Unauthorized", + "schema": { + "type": "string" + } + }, + "404": { + "description": "Not Found", + "schema": { + "type": "string" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "type": "string" + } + } + } + } + }, + "/categories/{categoryID}/tags/": { + "get": { + "description": "Retrieves all tags associated with a category", + "produces": [ + "application/json" + ], + "tags": [ + "category-tag" + ], + "summary": "Retrieve all tags by category", + "operationId": "get-tags-by-category", + "parameters": [ + { + "type": "string", + "description": "Category ID", + "name": "categoryID", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "Limit", + "name": "limit", + "in": "query" + }, + { + "type": "integer", + "description": "Page", + "name": "page", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/models.Tag" + } + } + }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "404": { + "description": "Not Found", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} + } + } + } + }, + "/categories/{categoryID}/tags/{tagID}/": { + "get": { + "description": "Retrieves a tag associated with a category", + "produces": [ + "application/json" + ], + "tags": [ + "category-tag" + ], + "summary": "Retrieve a tag by category", + "operationId": "get-tag-by-category", + "parameters": [ + { + "type": "string", + "description": "Category ID", + "name": "categoryID", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "Tag ID", + "name": "tagID", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/models.Tag" + } + }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "404": { + "description": "Not Found", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} + } + } + } + }, + "/clubs/": { + "get": { + "description": "Retrieves all clubs", + "produces": [ + "application/json" + ], + "tags": [ + "club" + ], + "summary": "Retrieve all clubs", + "operationId": "get-all-clubs", + "parameters": [ + { + "type": "integer", + "description": "Limit", + "name": "limit", + "in": "query" + }, + { + "type": "integer", + "description": "Page", + "name": "page", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/models.Club" + } + } + }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} + } + } + }, + "post": { + "description": "Creates a club", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "club" + ], + "summary": "Create a club", + "operationId": "create-club", + "parameters": [ + { + "description": "Club", + "name": "club", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/base.CreateClubRequestBody" + } + } + ], + "responses": { + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/models.Club" + } + }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "401": { + "description": "Unauthorized", + "schema": {} + }, + "404": { + "description": "Not Found", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} + } + } + } + }, + "/clubs/{clubID}/": { + "get": { + "description": "Retrieves a club", + "produces": [ + "application/json" + ], + "tags": [ + "club" + ], + "summary": "Retrieve a club", + "operationId": "get-club", + "parameters": [ + { + "type": "string", + "description": "Club ID", + "name": "clubID", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/models.Club" + } + }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "404": { + "description": "Not Found", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} + } + } + }, + "delete": { + "description": "Deletes a club", + "produces": [ + "application/json" + ], + "tags": [ + "club" + ], + "summary": "Delete a club", + "operationId": "delete-club", + "parameters": [ + { + "type": "string", + "description": "Club ID", + "name": "clubID", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "description": "No Content", + "schema": { + "type": "string" + } + }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "401": { + "description": "Unauthorized", + "schema": {} + }, + "404": { + "description": "Not Found", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} + } + } + }, + "patch": { + "description": "Updates a club", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "club" + ], + "summary": "Update a club", + "operationId": "update-club", + "parameters": [ + { + "type": "string", + "description": "Club ID", + "name": "clubID", + "in": "path", + "required": true + }, + { + "description": "Club", + "name": "club", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/base.UpdateClubRequestBody" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/models.Club" + } + }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "401": { + "description": "Unauthorized", + "schema": {} + }, + "404": { + "description": "Not Found", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} + } + } + } + }, + "/clubs/{clubID}/contacts/": { + "get": { + "description": "Retrieves all contacts associated with a club", + "produces": [ + "application/json" + ], + "tags": [ + "club-contact" + ], + "summary": "Retrieve all contacts for a club", + "operationId": "get-contacts-by-club", + "parameters": [ + { + "type": "string", + "description": "Club ID", + "name": "clubID", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/models.Contact" + } + } + }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "404": { + "description": "Not Found", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} + } + } + }, + "put": { + "description": "Creates a contact", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "club-contact" + ], + "summary": "Creates a contact", + "operationId": "put-contact", + "parameters": [ + { + "type": "string", + "description": "Club ID", + "name": "clubID", + "in": "path", + "required": true + }, + { + "description": "Contact Body", + "name": "contactBody", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/contacts.PutContactRequestBody" + } + } + ], + "responses": { + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/models.Contact" + } + }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "401": { + "description": "Unauthorized", + "schema": {} + }, + "404": { + "description": "Not Found", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} + } + } + } + }, + "/clubs/{clubID}/events/": { + "get": { + "description": "Retrieves all events associated with a club", + "produces": [ + "application/json" + ], + "tags": [ + "club-event" + ], + "summary": "Retrieve all events for a club", + "operationId": "get-events-by-club", + "parameters": [ + { + "type": "string", + "description": "Club ID", + "name": "clubID", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "Limit", + "name": "limit", + "in": "query" + }, + { + "type": "integer", + "description": "Page", + "name": "page", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/models.Event" + } + } + }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "404": { + "description": "Not Found", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} + } + } + } + }, + "/clubs/{clubID}/followers/": { + "get": { + "description": "Retrieves all followers associated with a club", + "produces": [ + "application/json" + ], + "tags": [ + "club-follower" + ], + "summary": "Retrieve all followers for a club", + "operationId": "get-followers-by-club", + "parameters": [ + { + "type": "string", + "description": "Club ID", + "name": "clubID", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "Limit", + "name": "limit", + "in": "query" + }, + { + "type": "integer", + "description": "Page", + "name": "page", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/models.User" + } + } + }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "404": { + "description": "Not Found", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} + } + } + } + }, + "/clubs/{clubID}/members/": { + "get": { + "description": "Retrieves all members associated with a club", + "produces": [ + "application/json" + ], + "tags": [ + "club-member" + ], + "summary": "Retrieve all members for a club", + "operationId": "get-members-by-club", + "parameters": [ + { + "type": "string", + "description": "Club ID", + "name": "clubID", + "in": "path", + "required": true + }, + { + "type": "integer", + "description": "Limit", + "name": "limit", + "in": "query" + }, + { + "type": "integer", + "description": "Page", + "name": "page", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/models.User" + } + } + }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "401": { + "description": "Unauthorized", + "schema": {} + }, + "404": { + "description": "Not Found", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} + } + } + }, + "post": { + "description": "Creates a new member associated with a club", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "club-member" + ], + "summary": "Create a new member for a club", + "operationId": "create-member-for-club", + "parameters": [ + { + "type": "string", + "description": "Club ID", + "name": "clubID", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "User ID", + "name": "userID", + "in": "path", + "required": true + } + ], + "responses": { + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/models.User" + } + }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "401": { + "description": "Unauthorized", + "schema": {} + }, + "404": { + "description": "Not Found", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} + } + } + }, + "delete": { + "description": "Deletes a member associated with a club", + "produces": [ + "application/json" + ], + "tags": [ + "club-member" + ], + "summary": "Delete a member from a club", + "operationId": "delete-member-from-club", + "parameters": [ + { + "type": "string", + "description": "Club ID", + "name": "clubID", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "User ID", + "name": "userID", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "description": "No Content", + "schema": { + "$ref": "#/definitions/models.User" + } + }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "401": { + "description": "Unauthorized", + "schema": {} + }, + "404": { + "description": "Not Found", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} + } + } + } + }, + "/clubs/{clubID}/poc/": { + "post": { + "description": "Creates a point of contact associated with a club", + "consumes": [ + "multipart/form-data" + ], + "produces": [ + "application/json" + ], + "tags": [ + "club-point-of-contact" + ], + "summary": "Create a point of contact for a club", + "operationId": "create-point-of-contact-by-club", + "parameters": [ + { + "type": "string", + "description": "Club ID", + "name": "clubID", + "in": "path", + "required": true + } + ], + "responses": { + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/models.PointOfContact" + } + }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "401": { + "description": "Unauthorized", + "schema": {} + }, + "404": { + "description": "Not Found", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} + } + } + } + }, + "/clubs/{clubID}/poc/{pocID}": { + "put": { + "description": "Updates a point of contact associated with a club", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "club-point-of-contact" + ], + "summary": "Update a point of contact for a club", + "operationId": "update-point-of-contact-by-club", + "parameters": [ + { + "type": "string", + "description": "Club ID", + "name": "clubID", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "Point of Contact ID", + "name": "pocID", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/models.PointOfContact" + } + }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "401": { + "description": "Unauthorized", + "schema": {} + }, + "404": { + "description": "Not Found", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} + } + } + }, + "delete": { + "description": "Delete a point of contact associated with a club", + "produces": [ + "application/json" + ], + "tags": [ + "club-point-of-contact" + ], + "summary": "Delete a point of contact for a club", + "operationId": "delete-point-of-contact-by-club", + "parameters": [ + { + "type": "string", + "description": "Club ID", + "name": "clubID", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "Point of Contact ID", + "name": "pocID", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "404": { + "description": "Not Found", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} + } + } + }, + "patch": { + "description": "Updates a point of contact photo associated with a club", + "consumes": [ + "multipart/form-data" + ], + "produces": [ + "application/json" + ], + "tags": [ + "club-point-of-contact" + ], + "summary": "Update a point of contact photo for a club", + "operationId": "update-point-of-contact-photo-by-club", + "parameters": [ + { + "type": "string", + "description": "Club ID", + "name": "clubID", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "Point of Contact ID", + "name": "pocID", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/models.PointOfContact" + } + }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "401": { + "description": "Unauthorized", + "schema": {} + }, + "404": { + "description": "Not Found", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} + } + } + } + }, + "/clubs/{clubID}/pocs/": { + "get": { + "description": "Retrieves all point of contacts associated with a club", + "produces": [ + "application/json" + ], + "tags": [ + "club-point-of-contact" + ], + "summary": "Retrieve all point of contacts for a club", + "operationId": "get-point-of-contacts-by-club", + "parameters": [ + { + "type": "string", + "description": "Club ID", + "name": "clubID", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/models.PointOfContact" + } + } + }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "404": { + "description": "Not Found", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} + } + } + } + }, + "/clubs/{clubID}/pocs/{pocID}": { + "get": { + "description": "Retrieves a point of contact associated with a club", + "produces": [ + "application/json" + ], + "tags": [ + "club-point-of-contact" + ], + "summary": "Retrieve a point of contact for a club", + "operationId": "get-point-of-contact-by-club", + "parameters": [ + { + "type": "string", + "description": "Club ID", + "name": "clubID", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "Point of Contact ID", + "name": "pocID", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/models.PointOfContact" + } + }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "404": { + "description": "Not Found", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} + } + } + } + }, + "/clubs/{clubID}/tags/": { + "get": { + "description": "Retrieves all tags associated with a club", + "produces": [ + "application/json" + ], + "tags": [ + "club-tag" + ], + "summary": "Retrieve all tags for a club", + "operationId": "get-tags-by-club", + "parameters": [ + { + "type": "string", + "description": "Club ID", + "name": "clubID", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/models.Tag" + } + } + }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "404": { + "description": "Not Found", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} + } + } + }, + "post": { + "description": "Creates tags for a club", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "club-tag" + ], + "summary": "Create club tags", + "operationId": "create-club-tags", + "parameters": [ + { + "type": "string", + "description": "Club ID", + "name": "clubID", + "in": "path", + "required": true + }, + { + "description": "Club Tags Body", + "name": "clubTagsBody", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/tags.CreateClubTagsRequestBody" + } + } + ], + "responses": { + "201": { + "description": "Created", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/models.Tag" + } + } + }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "401": { + "description": "Unauthorized", + "schema": {} + }, + "404": { + "description": "Not Found", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} + } + } + } + }, + "/clubs/{clubID}/tags/{tagID}/": { + "delete": { + "description": "Deletes a tag associated with a club", + "produces": [ + "application/json" + ], + "tags": [ + "club-tag" + ], + "summary": "Delete a tag for a club", + "operationId": "delete-tag-by-club", + "parameters": [ + { + "type": "string", + "description": "Club ID", + "name": "clubID", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "Tag ID", + "name": "tagID", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "description": "No Content", + "schema": { + "type": "string" + } + }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "401": { + "description": "Unauthorized", + "schema": {} + }, + "404": { + "description": "Not Found", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} + } + } + } + }, + "/contacts/": { + "get": { + "description": "Retrieves all contacts", + "produces": [ + "application/json" + ], + "tags": [ + "contact" + ], + "summary": "Retrieve all contacts", + "operationId": "get-contacts", + "parameters": [ + { + "type": "integer", + "description": "Limit", + "name": "limit", + "in": "query" + }, + { + "type": "integer", + "description": "Page", + "name": "page", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/models.Contact" + } + } + }, + "400": { + "description": "Bad Request", + "schema": { + "type": "string" + } + }, + "404": { + "description": "Not Found", + "schema": { + "type": "string" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "type": "string" + } + } + } + } + }, + "/contacts/{contactID}/": { + "get": { + "description": "Retrieves a contact by id", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "contact" + ], + "summary": "Retrieves a contact", + "operationId": "get-contact", + "parameters": [ + { + "type": "string", + "description": "Contact ID", + "name": "contactID", + "in": "path", + "required": true + } + ], + "responses": { + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/models.Contact" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "type": "string" + } + }, + "404": { + "description": "Not Found", + "schema": { + "type": "string" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "type": "string" + } + } + } + }, + "delete": { + "description": "Deletes a contact", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "contact" + ], + "summary": "Deletes a contact", + "operationId": "delete-contact", + "parameters": [ + { + "type": "string", + "description": "Contact ID", + "name": "contactID", + "in": "path", + "required": true + } + ], + "responses": { + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/models.Contact" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "type": "string" + } + }, + "404": { + "description": "Not Found", + "schema": { + "type": "string" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "type": "string" + } + } + } + } + }, + "/events/": { + "get": { + "description": "Retrieves all events", + "produces": [ + "application/json" + ], + "tags": [ + "event" + ], + "summary": "Retrieve all events", + "operationId": "get-all-events", + "parameters": [ + { + "type": "integer", + "description": "Limit", + "name": "limit", + "in": "query" + }, + { + "type": "integer", + "description": "Page", + "name": "page", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/models.Event" + } + } + }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "404": { + "description": "Not Found", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} + } + } + } + }, + "/events/{eventID}/": { + "get": { + "description": "Retrieves an event", + "produces": [ + "application/json" + ], + "tags": [ + "event" + ], + "summary": "Retrieve an event", + "operationId": "get-event", + "parameters": [ + { + "type": "string", + "description": "Event ID", + "name": "eventID", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/models.Event" + } + }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "404": { + "description": "Not Found", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} + } + } + } + }, + "/files/": { + "get": { + "description": "Retrieves all files", + "produces": [ + "application/json" + ], + "tags": [ + "file" + ], + "summary": "Retrieve all files", + "operationId": "get-files", + "parameters": [ + { + "type": "integer", + "description": "Limit", + "name": "limit", + "in": "query" + }, + { + "type": "integer", + "description": "Page", + "name": "page", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/models.File" + } + } + }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "401": { + "description": "Unauthorized", + "schema": {} + }, + "404": { + "description": "Not Found", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} + } + } + }, + "post": { + "description": "Creates a file", + "consumes": [ + "multipart/form-data" + ], + "produces": [ + "application/json" + ], + "tags": [ + "file" + ], + "summary": "Create a file", + "operationId": "create-file", + "parameters": [ + { + "description": "File", + "name": "file", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/base.CreateFileRequestBody" + } + } + ], + "responses": { + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/models.File" + } + }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "401": { + "description": "Unauthorized", + "schema": {} + }, + "404": { + "description": "Not Found", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} + } + } + } + }, + "/files/:fileID": { + "get": { + "description": "Retrieves a file", + "produces": [ + "application/json" + ], + "tags": [ + "file" + ], + "summary": "Retrieve a file", + "operationId": "get-file", + "parameters": [ + { + "type": "string", + "description": "File ID", + "name": "fileID", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/models.File" + } + }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "401": { + "description": "Unauthorized", + "schema": {} + }, + "404": { + "description": "Not Found", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} + } + } + }, + "delete": { + "description": "Deletes a file", + "produces": [ + "application/json" + ], + "tags": [ + "file" + ], + "summary": "Delete a file", + "operationId": "delete-file", + "parameters": [ + { + "type": "string", + "description": "File ID", + "name": "fileID", + "in": "path", + "required": true + } + ], + "responses": { + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/models.File" + } + }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "401": { + "description": "Unauthorized", + "schema": {} + }, + "404": { + "description": "Not Found", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} + } + } + } + }, + "/pocs/": { + "get": { + "description": "Retrieves all point of contacts", + "produces": [ + "application/json" + ], + "tags": [ + "point of contact" + ], + "summary": "Retrieve all point of contacts", + "operationId": "get-point-of-contacts", + "parameters": [ + { + "type": "integer", + "description": "Limit", + "name": "limit", + "in": "query" + }, + { + "type": "integer", + "description": "Page", + "name": "page", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/models.PointOfContact" + } + } + }, + "400": { + "description": "Bad Request", + "schema": { + "type": "string" + } + }, + "404": { + "description": "Not Found", + "schema": { + "type": "string" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "type": "string" + } + } + } + } + }, + "/pocs/{pocID}/": { + "get": { + "description": "Retrieves a point of contact by id", + "produces": [ + "application/json" + ], + "tags": [ + "point of contact" + ], + "summary": "Retrieves a point of contact", + "operationId": "get-point-of-contact", + "parameters": [ + { + "type": "string", + "description": "Point of Contact ID", + "name": "pocID", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/models.PointOfContact" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "type": "string" + } + }, + "404": { + "description": "Not Found", + "schema": { + "type": "string" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "type": "string" + } + } + } + } + }, + "/tags": { + "get": { + "description": "Retrieves all tags", + "produces": [ + "application/json" + ], + "tags": [ + "tag" + ], + "summary": "Retrieve all tags", + "operationId": "get-all-tags", + "parameters": [ + { + "type": "integer", + "description": "Limit", + "name": "limit", + "in": "query" + }, + { + "type": "integer", + "description": "Page", + "name": "page", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/models.Tag" + } + } + }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "404": { + "description": "Not Found", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} + } + } + } + }, + "/tags/": { + "post": { + "description": "Creates a tag", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "tag" + ], + "summary": "Create a tag", + "operationId": "create-tag", + "parameters": [ + { + "description": "Tag Body", + "name": "tagBody", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/base.CreateTagRequestBody" + } + } + ], + "responses": { + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/models.Tag" + } + }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "401": { + "description": "Unauthorized", + "schema": {} + }, + "404": { + "description": "Not Found", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} + } + } + } + }, + "/tags/{tagID}/": { + "get": { + "description": "Retrieves a tag", + "produces": [ + "application/json" + ], + "tags": [ + "tag" + ], + "summary": "Retrieve a tag", + "operationId": "get-tag", + "parameters": [ + { + "type": "string", + "description": "Tag ID", + "name": "tagID", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/models.Tag" + } + }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "404": { + "description": "Not Found", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} + } + } + }, + "delete": { + "description": "Deletes a tag", + "produces": [ + "application/json" + ], + "tags": [ + "tag" + ], + "summary": "Delete a tag", + "operationId": "delete-tag", + "parameters": [ + { + "type": "string", + "description": "Tag ID", + "name": "tagID", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "description": "No Content", + "schema": { + "type": "string" + } + }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "401": { + "description": "Unauthorized", + "schema": {} + }, + "404": { + "description": "Not Found", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} + } + } + }, + "patch": { + "description": "Updates a tag", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "tag" + ], + "summary": "Update a tag", + "operationId": "update-tag", + "parameters": [ + { + "type": "string", + "description": "Tag ID", + "name": "tagID", + "in": "path", + "required": true + }, + { + "description": "Tag", + "name": "tag", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/base.UpdateTagRequestBody" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/models.Tag" + } + }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "401": { + "description": "Unauthorized", + "schema": {} + }, + "404": { + "description": "Not Found", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} + } + } + } + }, + "/users/": { + "get": { + "description": "Retrieves all users", + "produces": [ + "application/json" + ], + "tags": [ + "user" + ], + "summary": "Retrieve all users", + "operationId": "get-users", + "parameters": [ + { + "type": "integer", + "description": "Limit", + "name": "limit", + "in": "query" + }, + { + "type": "integer", + "description": "Page", + "name": "page", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/models.User" + } + } + }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "401": { + "description": "Unauthorized", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} + } + } + } + }, + "/users/{userID}/": { + "get": { + "description": "Retrieves a user", + "produces": [ + "application/json" + ], + "tags": [ + "user" + ], + "summary": "Retrieve a user", + "operationId": "get-user", + "parameters": [ + { + "type": "string", + "description": "User ID", + "name": "userID", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/models.User" + } + }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "401": { + "description": "Unauthorized", + "schema": {} + }, + "404": { + "description": "Not Found", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} + } + } + }, + "delete": { + "description": "Deletes a user", + "produces": [ + "application/json" + ], + "tags": [ + "user" + ], + "summary": "Delete a user", + "operationId": "delete-user", + "parameters": [ + { + "type": "string", + "description": "User ID", + "name": "userID", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "description": "No Content", + "schema": { + "type": "string" + } + }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "401": { + "description": "Unauthorized", + "schema": {} + }, + "404": { + "description": "Not Found", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} + } + } + }, + "patch": { + "description": "Updates a user", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "user" + ], + "summary": "Update a user", + "operationId": "update-user", + "parameters": [ + { + "type": "string", + "description": "User ID", + "name": "userID", + "in": "path", + "required": true + }, + { + "description": "User Body", + "name": "userBody", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/base.UpdateUserRequestBody" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/models.User" + } + }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "401": { + "description": "Unauthorized", + "schema": {} + }, + "404": { + "description": "Not Found", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} + } + } + } + }, + "/users/{userID}/follower/": { + "get": { + "description": "Retrieves all clubs a user is following", + "produces": [ + "application/json" + ], + "tags": [ + "user-follower" + ], + "summary": "Retrieve all clubs a user is following", + "operationId": "get-following", + "parameters": [ + { + "type": "string", + "description": "User ID", + "name": "userID", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/models.Club" + } + } + }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "401": { + "description": "Unauthorized", + "schema": {} + }, + "404": { + "description": "Not Found", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} + } + } + } + }, + "/users/{userID}/follower/{clubID}/": { + "post": { + "description": "Follow a club", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "user-follower" + ], + "summary": "Follow a club", + "operationId": "create-following", + "parameters": [ + { + "type": "string", + "description": "User ID", + "name": "userID", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "Club ID", + "name": "clubID", + "in": "path", + "required": true + } + ], + "responses": { + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/utilities.SuccessResponse" + } + }, + "401": { + "description": "Unauthorized", + "schema": {} + }, + "404": { + "description": "Not Found", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} + } + } + }, + "delete": { + "description": "Unfollow a club", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "user-follower" + ], + "summary": "Unfollow a club", + "operationId": "delete-following", + "parameters": [ + { + "type": "string", + "description": "User ID", + "name": "userID", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "Club ID", + "name": "clubID", + "in": "path", + "required": true + } + ], + "responses": { + "204": { + "description": "No Content", + "schema": { + "$ref": "#/definitions/utilities.SuccessResponse" + } + }, + "401": { + "description": "Unauthorized", + "schema": {} + }, + "404": { + "description": "Not Found", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} + } + } + } + }, + "/users/{userID}/member/": { + "get": { + "description": "Retrieves all clubs a user is a member of", + "produces": [ + "application/json" + ], + "tags": [ + "user-member" + ], + "summary": "Retrieve all clubs a user is a member of", + "operationId": "get-membership", + "parameters": [ + { + "type": "string", + "description": "User ID", + "name": "userID", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/models.Club" + } + } + }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "401": { + "description": "Unauthorized", + "schema": {} + }, + "404": { + "description": "Not Found", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} + } + } + } + }, + "/users/{userID}/password": { + "patch": { + "description": "Updates a user's password", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "user" + ], + "summary": "Update a user's password", + "operationId": "update-password", + "parameters": [ + { + "type": "string", + "description": "User ID", + "name": "userID", + "in": "path", + "required": true + }, + { + "description": "Password Body", + "name": "passwordBody", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/auth.UpdatePasswordRequestBody" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "string" + } + }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "401": { + "description": "Unauthorized", + "schema": {} + }, + "404": { + "description": "Not Found", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} + } + } + } + }, + "/users/{userID}/tags/": { + "get": { + "description": "Retrieves all tags associated with a user", + "produces": [ + "application/json" + ], + "tags": [ + "user-tag" + ], + "summary": "Retrieve all tags for a user", + "operationId": "get-tags-by-user", + "parameters": [ + { + "type": "string", + "description": "User ID", + "name": "userID", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/models.Tag" + } + } + }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "401": { + "description": "Unauthorized", + "schema": {} + }, + "404": { + "description": "Not Found", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} + } + } + }, + "post": { + "description": "Creates tags for a user", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "user-tag" + ], + "summary": "Create user tags", + "operationId": "create-user-tags", + "parameters": [ + { + "type": "string", + "description": "User ID", + "name": "userID", + "in": "path", + "required": true + }, + { + "description": "User Tags Body", + "name": "userTagsBody", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/tags.CreateUserTagsBody" + } + } + ], + "responses": { + "201": { + "description": "Created", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/models.Tag" + } + } + }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "401": { + "description": "Unauthorized", + "schema": {} + }, + "404": { + "description": "Not Found", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} + } + } + }, + "delete": { + "description": "Creates tags for a user", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "user-tag" + ], + "summary": "Create user tags", + "operationId": "create-user-tags", + "parameters": [ + { + "type": "string", + "description": "User ID", + "name": "userID", + "in": "path", + "required": true + } + ], + "responses": { + "201": { + "description": "Created" + }, + "400": { + "description": "Bad Request", + "schema": {} + }, + "401": { + "description": "Unauthorized", + "schema": {} + }, + "404": { + "description": "Not Found", + "schema": {} + }, + "500": { + "description": "Internal Server Error", + "schema": {} + } + } } - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "401": { - "description": "Unauthorized", - "schema": {} - }, - "404": { - "description": "Not Found", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } } - } }, - "/users/{userID}/follower/": { - "get": { - "description": "Retrieves all clubs a user is following", - "produces": ["application/json"], - "tags": ["user-follower"], - "summary": "Retrieve all clubs a user is following", - "operationId": "get-following", - "parameters": [ - { - "type": "string", - "description": "User ID", - "name": "userID", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/models.Club" - } - } - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "401": { - "description": "Unauthorized", - "schema": {} - }, - "404": { - "description": "Not Found", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - } - }, - "/users/{userID}/follower/{clubID}/": { - "post": { - "description": "Follow a club", - "consumes": ["application/json"], - "produces": ["application/json"], - "tags": ["user-follower"], - "summary": "Follow a club", - "operationId": "create-following", - "parameters": [ - { - "type": "string", - "description": "User ID", - "name": "userID", - "in": "path", - "required": true - }, - { - "type": "string", - "description": "Club ID", - "name": "clubID", - "in": "path", - "required": true - } - ], - "responses": { - "201": { - "description": "Created", - "schema": { - "$ref": "#/definitions/utilities.SuccessResponse" - } - }, - "401": { - "description": "Unauthorized", - "schema": {} - }, - "404": { - "description": "Not Found", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - }, - "delete": { - "description": "Unfollow a club", - "consumes": ["application/json"], - "produces": ["application/json"], - "tags": ["user-follower"], - "summary": "Unfollow a club", - "operationId": "delete-following", - "parameters": [ - { + "definitions": { + "auth.LoginResponseBody": { + "type": "object", + "required": [ + "email", + "password" + ], + "properties": { + "email": { + "type": "string" + }, + "password": { + "description": "MARK: must be validated manually", + "type": "string", + "maxLength": 255 + } + } + }, + "auth.UpdatePasswordRequestBody": { + "type": "object", + "required": [ + "new_password", + "old_password" + ], + "properties": { + "new_password": { + "description": "MARK: must be validated manually", + "type": "string", + "maxLength": 255 + }, + "old_password": { + "description": "MARK: must be validated manually", + "type": "string", + "maxLength": 255 + } + } + }, + "base.CreateClubRequestBody": { + "type": "object", + "required": [ + "application_link", + "description", + "is_recruiting", + "name", + "preview", + "recruitment_cycle", + "recruitment_type", + "user_id" + ], + "properties": { + "application_link": { + "type": "string", + "maxLength": 255 + }, + "description": { + "type": "string", + "maxLength": 255 + }, + "is_recruiting": { + "type": "boolean" + }, + "logo": { + "type": "string", + "maxLength": 255 + }, + "name": { + "type": "string", + "maxLength": 255 + }, + "one_word_to_describe_us": { + "type": "string", + "maxLength": 255 + }, + "preview": { + "type": "string", + "maxLength": 255 + }, + "recruitment_cycle": { + "maxLength": 255, + "enum": [ + "fall", + "spring", + "fallSpring", + "always" + ], + "allOf": [ + { + "$ref": "#/definitions/models.RecruitmentCycle" + } + ] + }, + "recruitment_type": { + "maxLength": 255, + "enum": [ + "unrestricted", + "tryout", + "application" + ], + "allOf": [ + { + "$ref": "#/definitions/models.RecruitmentType" + } + ] + }, + "user_id": { + "type": "string" + }, + "weekly_time_commitment": { + "type": "integer", + "minimum": 1 + } + } + }, + "base.CreateFileRequestBody": { + "type": "object", + "required": [ + "owner_id", + "owner_type" + ], + "properties": { + "owner_id": { + "type": "string" + }, + "owner_type": { + "type": "string", + "maxLength": 255 + } + } + }, + "base.CreateTagRequestBody": { + "type": "object", + "required": [ + "category_id", + "name" + ], + "properties": { + "category_id": { + "type": "string" + }, + "name": { + "type": "string", + "maxLength": 255 + } + } + }, + "base.CreateUserRequestBody": { + "type": "object", + "required": [ + "email", + "first_name", + "last_name", + "password" + ], + "properties": { + "college": { + "enum": [ + "CAMD", + "DMSB", + "KCCS", + "CE", + "BCHS", + "SL", + "CPS", + "CS", + "CSSH" + ], + "allOf": [ + { + "$ref": "#/definitions/models.College" + } + ] + }, + "email": { + "type": "string", + "maxLength": 255 + }, + "first_name": { + "type": "string", + "maxLength": 255 + }, + "graduation_cycle": { + "maxLength": 255, + "enum": [ + "december", + "may" + ], + "allOf": [ + { + "$ref": "#/definitions/models.GraduationCycle" + } + ] + }, + "graduation_year": { + "type": "integer" + }, + "last_name": { + "type": "string", + "maxLength": 255 + }, + "major0": { + "description": "Optional fields", + "maxLength": 255, + "enum": [ + "africanaStudies", + "americanSignLanguage", + "americanSignLanguage-EnglishInterpreting", + "appliedPhysics", + "architecturalStudies", + "architecture", + "art:ArtVisualStudies", + "behavioralNeuroscience", + "biochemistry", + "bioengineering", + "biology", + "biomedicalPhysics", + "businessAdministration", + "businessAdministration:Accounting", + "businessAdministration:AccountingAndAdvisoryServices", + "businessAdministration:BrandManagement", + "businessAdministration:BusinessAnalytics", + "businessAdministration:CorporateInnovation", + "businessAdministration:EntrepreneurialStartups", + "businessAdministration:FamilyBusiness", + "businessAdministration:Finance", + "businessAdministration:Fintech", + "businessAdministration:HealthcareManagementAndConsulting", + "businessAdministration:Management", + "businessAdministration:ManagementInformationSystems", + "businessAdministration:Marketing", + "businessAdministration:MarketingAnalytics", + "businessAdministration:SocialInnovationAndEntrepreneurship", + "businessAdministration:SupplyChainManagement", + "cellAndMolecularBiology", + "chemicalEngineering", + "chemistry", + "civilEngineering", + "communicationStudies", + "computerEngineering", + "computerScience", + "computingAndLaw", + "criminologyAndCriminalJustice", + "culturalAnthropology", + "cybersecurity", + "dataScience", + "design", + "economics", + "electricalEngineering", + "english", + "environmentalAndSustainabilityStudies", + "environmentalEngineering", + "environmentalScience", + "environmentalStudies", + "gameArtAndAnimation", + "gameDesign", + "globalAsianStudies", + "healthScience", + "history", + "historyCultureAndLaw", + "humanServices", + "industrialEngineering", + "internationalAffairs", + "internationalBusiness", + "internationalBusiness:Accounting", + "internationalBusiness:AccountingAndAdvisoryServices", + "internationalBusiness:BrandManagement", + "internationalBusiness:BusinessAnalytics", + "internationalBusiness:CorporateInnovation", + "internationalBusiness:EntrepreneurialStartups", + "internationalBusiness:FamilyBusiness", + "internationalBusiness:Finance", + "internationalBusiness:Fintech", + "internationalBusiness:HealthcareManagementAndConsulting", + "internationalBusiness:Management", + "internationalBusiness:ManagementInformationSystems", + "internationalBusiness:Marketing", + "internationalBusiness:MarketingAnalytics", + "internationalBusiness:SocialInnovationAndEntrepreneurship", + "internationalBusiness:SupplyChainManagement", + "journalism", + "landscapeArchitecture", + "linguistics", + "marineBiology", + "mathematics", + "mechanicalEngineering", + "mediaAndScreenStudies", + "mediaArts", + "music", + "musicTechnology", + "nursing", + "pharmaceuticalSciences", + "pharmacy(PharmD)", + "philosophy", + "physics", + "politicalScience", + "politicsPhilosophyEconomics", + "psychology", + "publicHealth", + "publicRelations", + "religiousStudies", + "sociology", + "spanish", + "speechLanguagePathologyAndAudiology", + "theatre" + ], + "allOf": [ + { + "$ref": "#/definitions/models.Major" + } + ] + }, + "major1": { + "maxLength": 255, + "enum": [ + "africanaStudies", + "americanSignLanguage", + "americanSignLanguage-EnglishInterpreting", + "appliedPhysics", + "architecturalStudies", + "architecture", + "art:ArtVisualStudies", + "behavioralNeuroscience", + "biochemistry", + "bioengineering", + "biology", + "biomedicalPhysics", + "businessAdministration", + "businessAdministration:Accounting", + "businessAdministration:AccountingAndAdvisoryServices", + "businessAdministration:BrandManagement", + "businessAdministration:BusinessAnalytics", + "businessAdministration:CorporateInnovation", + "businessAdministration:EntrepreneurialStartups", + "businessAdministration:FamilyBusiness", + "businessAdministration:Finance", + "businessAdministration:Fintech", + "businessAdministration:HealthcareManagementAndConsulting", + "businessAdministration:Management", + "businessAdministration:ManagementInformationSystems", + "businessAdministration:Marketing", + "businessAdministration:MarketingAnalytics", + "businessAdministration:SocialInnovationAndEntrepreneurship", + "businessAdministration:SupplyChainManagement", + "cellAndMolecularBiology", + "chemicalEngineering", + "chemistry", + "civilEngineering", + "communicationStudies", + "computerEngineering", + "computerScience", + "computingAndLaw", + "criminologyAndCriminalJustice", + "culturalAnthropology", + "cybersecurity", + "dataScience", + "design", + "economics", + "electricalEngineering", + "english", + "environmentalAndSustainabilityStudies", + "environmentalEngineering", + "environmentalScience", + "environmentalStudies", + "gameArtAndAnimation", + "gameDesign", + "globalAsianStudies", + "healthScience", + "history", + "historyCultureAndLaw", + "humanServices", + "industrialEngineering", + "internationalAffairs", + "internationalBusiness", + "internationalBusiness:Accounting", + "internationalBusiness:AccountingAndAdvisoryServices", + "internationalBusiness:BrandManagement", + "internationalBusiness:BusinessAnalytics", + "internationalBusiness:CorporateInnovation", + "internationalBusiness:EntrepreneurialStartups", + "internationalBusiness:FamilyBusiness", + "internationalBusiness:Finance", + "internationalBusiness:Fintech", + "internationalBusiness:HealthcareManagementAndConsulting", + "internationalBusiness:Management", + "internationalBusiness:ManagementInformationSystems", + "internationalBusiness:Marketing", + "internationalBusiness:MarketingAnalytics", + "internationalBusiness:SocialInnovationAndEntrepreneurship", + "internationalBusiness:SupplyChainManagement", + "journalism", + "landscapeArchitecture", + "linguistics", + "marineBiology", + "mathematics", + "mechanicalEngineering", + "mediaAndScreenStudies", + "mediaArts", + "music", + "musicTechnology", + "nursing", + "pharmaceuticalSciences", + "pharmacy(PharmD)", + "philosophy", + "physics", + "politicalScience", + "politicsPhilosophyEconomics", + "psychology", + "publicHealth", + "publicRelations", + "religiousStudies", + "sociology", + "spanish", + "speechLanguagePathologyAndAudiology", + "theatre" + ], + "allOf": [ + { + "$ref": "#/definitions/models.Major" + } + ] + }, + "major2": { + "maxLength": 255, + "enum": [ + "africanaStudies", + "americanSignLanguage", + "americanSignLanguage-EnglishInterpreting", + "appliedPhysics", + "architecturalStudies", + "architecture", + "art:ArtVisualStudies", + "behavioralNeuroscience", + "biochemistry", + "bioengineering", + "biology", + "biomedicalPhysics", + "businessAdministration", + "businessAdministration:Accounting", + "businessAdministration:AccountingAndAdvisoryServices", + "businessAdministration:BrandManagement", + "businessAdministration:BusinessAnalytics", + "businessAdministration:CorporateInnovation", + "businessAdministration:EntrepreneurialStartups", + "businessAdministration:FamilyBusiness", + "businessAdministration:Finance", + "businessAdministration:Fintech", + "businessAdministration:HealthcareManagementAndConsulting", + "businessAdministration:Management", + "businessAdministration:ManagementInformationSystems", + "businessAdministration:Marketing", + "businessAdministration:MarketingAnalytics", + "businessAdministration:SocialInnovationAndEntrepreneurship", + "businessAdministration:SupplyChainManagement", + "cellAndMolecularBiology", + "chemicalEngineering", + "chemistry", + "civilEngineering", + "communicationStudies", + "computerEngineering", + "computerScience", + "computingAndLaw", + "criminologyAndCriminalJustice", + "culturalAnthropology", + "cybersecurity", + "dataScience", + "design", + "economics", + "electricalEngineering", + "english", + "environmentalAndSustainabilityStudies", + "environmentalEngineering", + "environmentalScience", + "environmentalStudies", + "gameArtAndAnimation", + "gameDesign", + "globalAsianStudies", + "healthScience", + "history", + "historyCultureAndLaw", + "humanServices", + "industrialEngineering", + "internationalAffairs", + "internationalBusiness", + "internationalBusiness:Accounting", + "internationalBusiness:AccountingAndAdvisoryServices", + "internationalBusiness:BrandManagement", + "internationalBusiness:BusinessAnalytics", + "internationalBusiness:CorporateInnovation", + "internationalBusiness:EntrepreneurialStartups", + "internationalBusiness:FamilyBusiness", + "internationalBusiness:Finance", + "internationalBusiness:Fintech", + "internationalBusiness:HealthcareManagementAndConsulting", + "internationalBusiness:Management", + "internationalBusiness:ManagementInformationSystems", + "internationalBusiness:Marketing", + "internationalBusiness:MarketingAnalytics", + "internationalBusiness:SocialInnovationAndEntrepreneurship", + "internationalBusiness:SupplyChainManagement", + "journalism", + "landscapeArchitecture", + "linguistics", + "marineBiology", + "mathematics", + "mechanicalEngineering", + "mediaAndScreenStudies", + "mediaArts", + "music", + "musicTechnology", + "nursing", + "pharmaceuticalSciences", + "pharmacy(PharmD)", + "philosophy", + "physics", + "politicalScience", + "politicsPhilosophyEconomics", + "psychology", + "publicHealth", + "publicRelations", + "religiousStudies", + "sociology", + "spanish", + "speechLanguagePathologyAndAudiology", + "theatre" + ], + "allOf": [ + { + "$ref": "#/definitions/models.Major" + } + ] + }, + "password": { + "description": "MARK: must be validated manually", + "type": "string", + "maxLength": 255 + } + } + }, + "base.UpdateClubRequestBody": { + "type": "object", + "required": [ + "application_link", + "recruitment_cycle", + "recruitment_type" + ], + "properties": { + "application_link": { + "type": "string", + "maxLength": 255 + }, + "description": { + "type": "string", + "maxLength": 255 + }, + "is_recruiting": { + "type": "boolean" + }, + "logo": { + "type": "string", + "maxLength": 255 + }, + "name": { + "type": "string", + "maxLength": 255 + }, + "one_word_to_describe_us": { + "type": "string", + "maxLength": 255 + }, + "preview": { + "type": "string", + "maxLength": 255 + }, + "recruitment_cycle": { + "maxLength": 255, + "enum": [ + "fall", + "spring", + "fallSpring", + "always" + ], + "allOf": [ + { + "$ref": "#/definitions/models.RecruitmentCycle" + } + ] + }, + "recruitment_type": { + "maxLength": 255, + "enum": [ + "unrestricted", + "tryout", + "application" + ], + "allOf": [ + { + "$ref": "#/definitions/models.RecruitmentType" + } + ] + }, + "weekly_time_commitment": { + "type": "integer", + "minimum": 1 + } + } + }, + "base.UpdateTagRequestBody": { + "type": "object", + "properties": { + "category_id": { + "type": "string" + }, + "name": { + "type": "string", + "maxLength": 255 + } + } + }, + "base.UpdateUserRequestBody": { + "type": "object", + "properties": { + "college": { + "enum": [ + "CAMD", + "DMSB", + "KCCS", + "CE", + "BCHS", + "SL", + "CPS", + "CS", + "CSSH" + ], + "allOf": [ + { + "$ref": "#/definitions/models.College" + } + ] + }, + "first_name": { + "type": "string", + "maxLength": 255 + }, + "graduation_cycle": { + "maxLength": 255, + "enum": [ + "december", + "may" + ], + "allOf": [ + { + "$ref": "#/definitions/models.GraduationCycle" + } + ] + }, + "graduation_year": { + "type": "integer" + }, + "last_name": { + "type": "string", + "maxLength": 255 + }, + "major0": { + "maxLength": 255, + "enum": [ + "africanaStudies", + "americanSignLanguage", + "americanSignLanguage-EnglishInterpreting", + "appliedPhysics", + "architecturalStudies", + "architecture", + "art:ArtVisualStudies", + "behavioralNeuroscience", + "biochemistry", + "bioengineering", + "biology", + "biomedicalPhysics", + "businessAdministration", + "businessAdministration:Accounting", + "businessAdministration:AccountingAndAdvisoryServices", + "businessAdministration:BrandManagement", + "businessAdministration:BusinessAnalytics", + "businessAdministration:CorporateInnovation", + "businessAdministration:EntrepreneurialStartups", + "businessAdministration:FamilyBusiness", + "businessAdministration:Finance", + "businessAdministration:Fintech", + "businessAdministration:HealthcareManagementAndConsulting", + "businessAdministration:Management", + "businessAdministration:ManagementInformationSystems", + "businessAdministration:Marketing", + "businessAdministration:MarketingAnalytics", + "businessAdministration:SocialInnovationAndEntrepreneurship", + "businessAdministration:SupplyChainManagement", + "cellAndMolecularBiology", + "chemicalEngineering", + "chemistry", + "civilEngineering", + "communicationStudies", + "computerEngineering", + "computerScience", + "computingAndLaw", + "criminologyAndCriminalJustice", + "culturalAnthropology", + "cybersecurity", + "dataScience", + "design", + "economics", + "electricalEngineering", + "english", + "environmentalAndSustainabilityStudies", + "environmentalEngineering", + "environmentalScience", + "environmentalStudies", + "gameArtAndAnimation", + "gameDesign", + "globalAsianStudies", + "healthScience", + "history", + "historyCultureAndLaw", + "humanServices", + "industrialEngineering", + "internationalAffairs", + "internationalBusiness", + "internationalBusiness:Accounting", + "internationalBusiness:AccountingAndAdvisoryServices", + "internationalBusiness:BrandManagement", + "internationalBusiness:BusinessAnalytics", + "internationalBusiness:CorporateInnovation", + "internationalBusiness:EntrepreneurialStartups", + "internationalBusiness:FamilyBusiness", + "internationalBusiness:Finance", + "internationalBusiness:Fintech", + "internationalBusiness:HealthcareManagementAndConsulting", + "internationalBusiness:Management", + "internationalBusiness:ManagementInformationSystems", + "internationalBusiness:Marketing", + "internationalBusiness:MarketingAnalytics", + "internationalBusiness:SocialInnovationAndEntrepreneurship", + "internationalBusiness:SupplyChainManagement", + "journalism", + "landscapeArchitecture", + "linguistics", + "marineBiology", + "mathematics", + "mechanicalEngineering", + "mediaAndScreenStudies", + "mediaArts", + "music", + "musicTechnology", + "nursing", + "pharmaceuticalSciences", + "pharmacy(PharmD)", + "philosophy", + "physics", + "politicalScience", + "politicsPhilosophyEconomics", + "psychology", + "publicHealth", + "publicRelations", + "religiousStudies", + "sociology", + "spanish", + "speechLanguagePathologyAndAudiology", + "theatre" + ], + "allOf": [ + { + "$ref": "#/definitions/models.Major" + } + ] + }, + "major1": { + "maxLength": 255, + "enum": [ + "africanaStudies", + "americanSignLanguage", + "americanSignLanguage-EnglishInterpreting", + "appliedPhysics", + "architecturalStudies", + "architecture", + "art:ArtVisualStudies", + "behavioralNeuroscience", + "biochemistry", + "bioengineering", + "biology", + "biomedicalPhysics", + "businessAdministration", + "businessAdministration:Accounting", + "businessAdministration:AccountingAndAdvisoryServices", + "businessAdministration:BrandManagement", + "businessAdministration:BusinessAnalytics", + "businessAdministration:CorporateInnovation", + "businessAdministration:EntrepreneurialStartups", + "businessAdministration:FamilyBusiness", + "businessAdministration:Finance", + "businessAdministration:Fintech", + "businessAdministration:HealthcareManagementAndConsulting", + "businessAdministration:Management", + "businessAdministration:ManagementInformationSystems", + "businessAdministration:Marketing", + "businessAdministration:MarketingAnalytics", + "businessAdministration:SocialInnovationAndEntrepreneurship", + "businessAdministration:SupplyChainManagement", + "cellAndMolecularBiology", + "chemicalEngineering", + "chemistry", + "civilEngineering", + "communicationStudies", + "computerEngineering", + "computerScience", + "computingAndLaw", + "criminologyAndCriminalJustice", + "culturalAnthropology", + "cybersecurity", + "dataScience", + "design", + "economics", + "electricalEngineering", + "english", + "environmentalAndSustainabilityStudies", + "environmentalEngineering", + "environmentalScience", + "environmentalStudies", + "gameArtAndAnimation", + "gameDesign", + "globalAsianStudies", + "healthScience", + "history", + "historyCultureAndLaw", + "humanServices", + "industrialEngineering", + "internationalAffairs", + "internationalBusiness", + "internationalBusiness:Accounting", + "internationalBusiness:AccountingAndAdvisoryServices", + "internationalBusiness:BrandManagement", + "internationalBusiness:BusinessAnalytics", + "internationalBusiness:CorporateInnovation", + "internationalBusiness:EntrepreneurialStartups", + "internationalBusiness:FamilyBusiness", + "internationalBusiness:Finance", + "internationalBusiness:Fintech", + "internationalBusiness:HealthcareManagementAndConsulting", + "internationalBusiness:Management", + "internationalBusiness:ManagementInformationSystems", + "internationalBusiness:Marketing", + "internationalBusiness:MarketingAnalytics", + "internationalBusiness:SocialInnovationAndEntrepreneurship", + "internationalBusiness:SupplyChainManagement", + "journalism", + "landscapeArchitecture", + "linguistics", + "marineBiology", + "mathematics", + "mechanicalEngineering", + "mediaAndScreenStudies", + "mediaArts", + "music", + "musicTechnology", + "nursing", + "pharmaceuticalSciences", + "pharmacy(PharmD)", + "philosophy", + "physics", + "politicalScience", + "politicsPhilosophyEconomics", + "psychology", + "publicHealth", + "publicRelations", + "religiousStudies", + "sociology", + "spanish", + "speechLanguagePathologyAndAudiology", + "theatre" + ], + "allOf": [ + { + "$ref": "#/definitions/models.Major" + } + ] + }, + "major2": { + "maxLength": 255, + "enum": [ + "africanaStudies", + "americanSignLanguage", + "americanSignLanguage-EnglishInterpreting", + "appliedPhysics", + "architecturalStudies", + "architecture", + "art:ArtVisualStudies", + "behavioralNeuroscience", + "biochemistry", + "bioengineering", + "biology", + "biomedicalPhysics", + "businessAdministration", + "businessAdministration:Accounting", + "businessAdministration:AccountingAndAdvisoryServices", + "businessAdministration:BrandManagement", + "businessAdministration:BusinessAnalytics", + "businessAdministration:CorporateInnovation", + "businessAdministration:EntrepreneurialStartups", + "businessAdministration:FamilyBusiness", + "businessAdministration:Finance", + "businessAdministration:Fintech", + "businessAdministration:HealthcareManagementAndConsulting", + "businessAdministration:Management", + "businessAdministration:ManagementInformationSystems", + "businessAdministration:Marketing", + "businessAdministration:MarketingAnalytics", + "businessAdministration:SocialInnovationAndEntrepreneurship", + "businessAdministration:SupplyChainManagement", + "cellAndMolecularBiology", + "chemicalEngineering", + "chemistry", + "civilEngineering", + "communicationStudies", + "computerEngineering", + "computerScience", + "computingAndLaw", + "criminologyAndCriminalJustice", + "culturalAnthropology", + "cybersecurity", + "dataScience", + "design", + "economics", + "electricalEngineering", + "english", + "environmentalAndSustainabilityStudies", + "environmentalEngineering", + "environmentalScience", + "environmentalStudies", + "gameArtAndAnimation", + "gameDesign", + "globalAsianStudies", + "healthScience", + "history", + "historyCultureAndLaw", + "humanServices", + "industrialEngineering", + "internationalAffairs", + "internationalBusiness", + "internationalBusiness:Accounting", + "internationalBusiness:AccountingAndAdvisoryServices", + "internationalBusiness:BrandManagement", + "internationalBusiness:BusinessAnalytics", + "internationalBusiness:CorporateInnovation", + "internationalBusiness:EntrepreneurialStartups", + "internationalBusiness:FamilyBusiness", + "internationalBusiness:Finance", + "internationalBusiness:Fintech", + "internationalBusiness:HealthcareManagementAndConsulting", + "internationalBusiness:Management", + "internationalBusiness:ManagementInformationSystems", + "internationalBusiness:Marketing", + "internationalBusiness:MarketingAnalytics", + "internationalBusiness:SocialInnovationAndEntrepreneurship", + "internationalBusiness:SupplyChainManagement", + "journalism", + "landscapeArchitecture", + "linguistics", + "marineBiology", + "mathematics", + "mechanicalEngineering", + "mediaAndScreenStudies", + "mediaArts", + "music", + "musicTechnology", + "nursing", + "pharmaceuticalSciences", + "pharmacy(PharmD)", + "philosophy", + "physics", + "politicalScience", + "politicsPhilosophyEconomics", + "psychology", + "publicHealth", + "publicRelations", + "religiousStudies", + "sociology", + "spanish", + "speechLanguagePathologyAndAudiology", + "theatre" + ], + "allOf": [ + { + "$ref": "#/definitions/models.Major" + } + ] + } + } + }, + "base.VerifyEmailRequestBody": { + "type": "object", + "required": [ + "email", + "token" + ], + "properties": { + "email": { + "type": "string" + }, + "token": { + "type": "string" + } + } + }, + "base.VerifyPasswordResetTokenRequestBody": { + "type": "object", + "required": [ + "new_password", + "token", + "verify_new_password" + ], + "properties": { + "new_password": { + "type": "string", + "minLength": 8 + }, + "token": { + "type": "string" + }, + "verify_new_password": { + "type": "string", + "minLength": 8 + } + } + }, + "categories.CategoryRequestBody": { + "type": "object", + "required": [ + "name" + ], + "properties": { + "name": { + "type": "string", + "maxLength": 255 + } + } + }, + "contacts.PutContactRequestBody": { + "type": "object", + "required": [ + "content", + "type" + ], + "properties": { + "content": { + "type": "string", + "maxLength": 255 + }, + "type": { + "maxLength": 255, + "enum": [ + "facebook", + "instagram", + "x", + "linkedin", + "youtube", + "github", + "slack", + "discord", + "email", + "customSite" + ], + "allOf": [ + { + "$ref": "#/definitions/models.ContactType" + } + ] + } + } + }, + "models.Category": { + "type": "object", + "properties": { + "created_at": { + "type": "string", + "example": "2023-09-20T16:34:50Z" + }, + "id": { + "type": "string", + "example": "123e4567-e89b-12d3-a456-426614174000" + }, + "name": { + "type": "string" + }, + "updated_at": { + "type": "string", + "example": "2023-09-20T16:34:50Z" + } + } + }, + "models.Club": { + "type": "object", + "properties": { + "application_link": { + "type": "string" + }, + "created_at": { + "type": "string", + "example": "2023-09-20T16:34:50Z" + }, + "description": { + "type": "string" + }, + "id": { + "type": "string", + "example": "123e4567-e89b-12d3-a456-426614174000" + }, + "is_recruiting": { + "type": "boolean" + }, + "logo": { + "type": "string" + }, + "name": { + "type": "string" + }, + "num_members": { + "type": "integer" + }, + "one_word_to_describe_us": { + "type": "string" + }, + "preview": { + "type": "string" + }, + "recruitment_cycle": { + "$ref": "#/definitions/models.RecruitmentCycle" + }, + "recruitment_type": { + "$ref": "#/definitions/models.RecruitmentType" + }, + "updated_at": { + "type": "string", + "example": "2023-09-20T16:34:50Z" + }, + "weekly_time_commitment": { + "type": "integer" + } + } + }, + "models.College": { "type": "string", - "description": "User ID", - "name": "userID", - "in": "path", - "required": true - }, - { + "enum": [ + "CAMD", + "DMSB", + "KCCS", + "CE", + "BCHS", + "SL", + "CPS", + "CS", + "CSSH" + ], + "x-enum-comments": { + "BCHS": "Bouvé College of Health Sciences", + "CAMD": "College of Arts, Media and Design", + "CE": "College of Engineering", + "CPS": "College of Professional Studies", + "CS": "College of Science", + "CSSH": "College of Social Sciences and Humanities", + "DMSB": "D'Amore-McKim School of Business", + "KCCS": "Khoury College of Computer Sciences", + "SL": "School of Law" + }, + "x-enum-varnames": [ + "CAMD", + "DMSB", + "KCCS", + "CE", + "BCHS", + "SL", + "CPS", + "CS", + "CSSH" + ] + }, + "models.Contact": { + "type": "object", + "properties": { + "content": { + "type": "string" + }, + "created_at": { + "type": "string", + "example": "2023-09-20T16:34:50Z" + }, + "id": { + "type": "string", + "example": "123e4567-e89b-12d3-a456-426614174000" + }, + "type": { + "$ref": "#/definitions/models.ContactType" + }, + "updated_at": { + "type": "string", + "example": "2023-09-20T16:34:50Z" + } + } + }, + "models.ContactType": { "type": "string", - "description": "Club ID", - "name": "clubID", - "in": "path", - "required": true - } - ], - "responses": { - "204": { - "description": "No Content", - "schema": { - "$ref": "#/definitions/utilities.SuccessResponse" - } - }, - "401": { - "description": "Unauthorized", - "schema": {} - }, - "404": { - "description": "Not Found", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - } - }, - "/users/{userID}/member/": { - "get": { - "description": "Retrieves all clubs a user is a member of", - "produces": ["application/json"], - "tags": ["user-member"], - "summary": "Retrieve all clubs a user is a member of", - "operationId": "get-membership", - "parameters": [ - { + "enum": [ + "facebook", + "instagram", + "x", + "linkedin", + "youtube", + "github", + "slack", + "discord", + "email", + "customSite" + ], + "x-enum-varnames": [ + "Facebook", + "Instagram", + "X", + "LinkedIn", + "YouTube", + "GitHub", + "Slack", + "Discord", + "Email", + "CustomSite" + ] + }, + "models.Event": { + "type": "object", + "properties": { + "created_at": { + "type": "string", + "example": "2023-09-20T16:34:50Z" + }, + "description": { + "type": "string" + }, + "end_time": { + "type": "string" + }, + "event_type": { + "description": "geoshi", + "allOf": [ + { + "$ref": "#/definitions/models.EventType" + } + ] + }, + "host": { + "type": "string" + }, + "id": { + "type": "string", + "example": "123e4567-e89b-12d3-a456-426614174000" + }, + "is_archived": { + "type": "boolean" + }, + "is_draft": { + "type": "boolean" + }, + "is_public": { + "description": "internal housekeeping states", + "type": "boolean" + }, + "link": { + "type": "string" + }, + "location": { + "type": "string" + }, + "name": { + "description": "details", + "type": "string" + }, + "preview": { + "type": "string" + }, + "start_time": { + "description": "timing", + "type": "string" + }, + "updated_at": { + "type": "string", + "example": "2023-09-20T16:34:50Z" + } + } + }, + "models.EventType": { "type": "string", - "description": "User ID", - "name": "userID", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/models.Club" - } - } - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "401": { - "description": "Unauthorized", - "schema": {} - }, - "404": { - "description": "Not Found", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - } - }, - "/users/{userID}/password": { - "patch": { - "description": "Updates a user's password", - "consumes": ["application/json"], - "produces": ["application/json"], - "tags": ["user"], - "summary": "Update a user's password", - "operationId": "update-password", - "parameters": [ - { + "enum": [ + "hybrid", + "in_person", + "virtual" + ], + "x-enum-varnames": [ + "Hybrid", + "InPerson", + "Virtual" + ] + }, + "models.File": { + "type": "object", + "properties": { + "created_at": { + "type": "string", + "example": "2023-09-20T16:34:50Z" + }, + "file_name": { + "type": "string" + }, + "file_size": { + "type": "integer" + }, + "file_type": { + "type": "string" + }, + "file_url": { + "type": "string" + }, + "id": { + "type": "string", + "example": "123e4567-e89b-12d3-a456-426614174000" + }, + "object_key": { + "type": "string" + }, + "updated_at": { + "type": "string", + "example": "2023-09-20T16:34:50Z" + } + } + }, + "models.GraduationCycle": { "type": "string", - "description": "User ID", - "name": "userID", - "in": "path", - "required": true - }, - { - "description": "Password Body", - "name": "passwordBody", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/models.UpdatePasswordRequestBody" - } - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "string" - } - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "401": { - "description": "Unauthorized", - "schema": {} - }, - "404": { - "description": "Not Found", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - } - }, - "/users/{userID}/tags/": { - "get": { - "description": "Retrieves all tags associated with a user", - "produces": ["application/json"], - "tags": ["user-tag"], - "summary": "Retrieve all tags for a user", - "operationId": "get-tags-by-user", - "parameters": [ - { + "enum": [ + "december", + "may" + ], + "x-enum-varnames": [ + "December", + "May" + ] + }, + "models.Major": { "type": "string", - "description": "User ID", - "name": "userID", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/models.Tag" - } - } - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "401": { - "description": "Unauthorized", - "schema": {} - }, - "404": { - "description": "Not Found", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - }, - "post": { - "description": "Creates tags for a user", - "consumes": ["application/json"], - "produces": ["application/json"], - "tags": ["user-tag"], - "summary": "Create user tags", - "operationId": "create-user-tags", - "parameters": [ - { + "enum": [ + "africanaStudies", + "americanSignLanguage", + "americanSignLanguage-EnglishInterpreting", + "appliedPhysics", + "architecturalStudies", + "architecture", + "art:ArtVisualStudies", + "behavioralNeuroscience", + "biochemistry", + "bioengineering", + "biology", + "biomedicalPhysics", + "businessAdministration", + "businessAdministration:Accounting", + "businessAdministration:AccountingAndAdvisoryServices", + "businessAdministration:BrandManagement", + "businessAdministration:BusinessAnalytics", + "businessAdministration:CorporateInnovation", + "businessAdministration:EntrepreneurialStartups", + "businessAdministration:FamilyBusiness", + "businessAdministration:Finance", + "businessAdministration:Fintech", + "businessAdministration:HealthcareManagementAndConsulting", + "businessAdministration:Management", + "businessAdministration:ManagementInformationSystems", + "businessAdministration:Marketing", + "businessAdministration:MarketingAnalytics", + "businessAdministration:SocialInnovationAndEntrepreneurship", + "businessAdministration:SupplyChainManagement", + "cellAndMolecularBiology", + "chemicalEngineering", + "chemistry", + "civilEngineering", + "communicationStudies", + "computerEngineering", + "computerScience", + "computingAndLaw", + "criminologyAndCriminalJustice", + "culturalAnthropology", + "cybersecurity", + "dataScience", + "design", + "economics", + "electricalEngineering", + "english", + "environmentalAndSustainabilityStudies", + "environmentalEngineering", + "environmentalScience", + "environmentalStudies", + "gameArtAndAnimation", + "gameDesign", + "globalAsianStudies", + "healthScience", + "history", + "historyCultureAndLaw", + "humanServices", + "industrialEngineering", + "internationalAffairs", + "internationalBusiness", + "internationalBusiness:Accounting", + "internationalBusiness:AccountingAndAdvisoryServices", + "internationalBusiness:BrandManagement", + "internationalBusiness:BusinessAnalytics", + "internationalBusiness:CorporateInnovation", + "internationalBusiness:EntrepreneurialStartups", + "internationalBusiness:FamilyBusiness", + "internationalBusiness:Finance", + "internationalBusiness:Fintech", + "internationalBusiness:HealthcareManagementAndConsulting", + "internationalBusiness:Management", + "internationalBusiness:ManagementInformationSystems", + "internationalBusiness:Marketing", + "internationalBusiness:MarketingAnalytics", + "internationalBusiness:SocialInnovationAndEntrepreneurship", + "internationalBusiness:SupplyChainManagement", + "journalism", + "landscapeArchitecture", + "linguistics", + "marineBiology", + "mathematics", + "mechanicalEngineering", + "mediaAndScreenStudies", + "mediaArts", + "music", + "musicTechnology", + "nursing", + "pharmaceuticalSciences", + "pharmacy(PharmD)", + "philosophy", + "physics", + "politicalScience", + "politicsPhilosophyEconomics", + "psychology", + "publicHealth", + "publicRelations", + "religiousStudies", + "sociology", + "spanish", + "speechLanguagePathologyAndAudiology", + "theatre" + ], + "x-enum-varnames": [ + "AfricanaStudies", + "AmericanSignLanguage", + "AmericanSignLanguageEnglishInterpreting", + "AppliedPhysics", + "ArchitecturalStudies", + "Architecture", + "ArtArtVisualStudies", + "BehavioralNeuroscience", + "Biochemistry", + "Bioengineering", + "Biology", + "BiomedicalPhysics", + "BusinessAdministration", + "BusinessAdministrationAccounting", + "BusinessAdministrationAccountingAndAdvisoryServices", + "BusinessAdministrationBrandManagement", + "BusinessAdministrationBusinessAnalytics", + "BusinessAdministrationCorporateInnovation", + "BusinessAdministrationEntrepreneurialStartups", + "BusinessAdministrationFamilyBusiness", + "BusinessAdministrationFinance", + "BusinessAdministrationFintech", + "BusinessAdministrationHealthcareManagementAndConsulting", + "BusinessAdministrationManagement", + "BusinessAdministrationManagementInformationSystems", + "BusinessAdministrationMarketing", + "BusinessAdministrationMarketingAnalytics", + "BusinessAdministrationSocialInnovationAndEntrepreneurship", + "BusinessAdministrationSupplyChainManagement", + "CellAndMolecularBiology", + "ChemicalEngineering", + "Chemistry", + "CivilEngineering", + "CommunicationStudies", + "ComputerEngineering", + "ComputerScience", + "ComputingAndLaw", + "CriminologyAndCriminalJustice", + "CulturalAnthropology", + "Cybersecurity", + "DataScience", + "Design", + "Economics", + "ElectricalEngineering", + "English", + "EnvironmentalAndSustainabilityStudies", + "EnvironmentalEngineering", + "EnvironmentalScience", + "EnvironmentalStudies", + "GameArtAndAnimation", + "GameDesign", + "GlobalAsianStudies", + "HealthScience", + "History", + "HistoryCultureAndLaw", + "HumanServices", + "IndustrialEngineering", + "InternationalAffairs", + "InternationalBusiness", + "InternationalBusinessAccounting", + "InternationalBusinessAccountingAndAdvisoryServices", + "InternationalBusinessBrandManagement", + "InternationalBusinessBusinessAnalytics", + "InternationalBusinessCorporateInnovation", + "InternationalBusinessEntrepreneurialStartups", + "InternationalBusinessFamilyBusiness", + "InternationalBusinessFinance", + "InternationalBusinessFintech", + "InternationalBusinessHealthcareManagementAndConsulting", + "InternationalBusinessManagement", + "InternationalBusinessManagementInformationSystems", + "InternationalBusinessMarketing", + "InternationalBusinessMarketingAnalytics", + "InternationalBusinessSocialInnovationAndEntrepreneurship", + "InternationalBusinessSupplyChainManagement", + "Journalism", + "LandscapeArchitecture", + "Linguistics", + "MarineBiology", + "Mathematics", + "MechanicalEngineering", + "MediaAndScreenStudies", + "MediaArts", + "Music", + "MusicTechnology", + "Nursing", + "PharmaceuticalSciences", + "PharmacyPharmD", + "Philosophy", + "Physics", + "PoliticalScience", + "PoliticsPhilosophyEconomics", + "Psychology", + "PublicHealth", + "PublicRelations", + "ReligiousStudies", + "Sociology", + "Spanish", + "SpeechLanguagePathologyAndAudiology", + "Theatre" + ] + }, + "models.PointOfContact": { + "type": "object", + "properties": { + "created_at": { + "type": "string", + "example": "2023-09-20T16:34:50Z" + }, + "email": { + "type": "string" + }, + "id": { + "type": "string", + "example": "123e4567-e89b-12d3-a456-426614174000" + }, + "name": { + "type": "string" + }, + "photo_file": { + "$ref": "#/definitions/models.File" + }, + "position": { + "type": "string" + }, + "updated_at": { + "type": "string", + "example": "2023-09-20T16:34:50Z" + } + } + }, + "models.RecruitmentCycle": { "type": "string", - "description": "User ID", - "name": "userID", - "in": "path", - "required": true - }, - { - "description": "User Tags Body", - "name": "userTagsBody", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/tag.CreateUserTagsBody" - } - } - ], - "responses": { - "201": { - "description": "Created", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/models.Tag" - } - } - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "401": { - "description": "Unauthorized", - "schema": {} - }, - "404": { - "description": "Not Found", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - }, - "delete": { - "description": "Creates tags for a user", - "consumes": ["application/json"], - "produces": ["application/json"], - "tags": ["user-tag"], - "summary": "Create user tags", - "operationId": "create-user-tags", - "parameters": [ - { + "enum": [ + "fall", + "spring", + "fallSpring", + "always" + ], + "x-enum-varnames": [ + "Fall", + "Spring", + "FallSpring", + "Always" + ] + }, + "models.RecruitmentType": { "type": "string", - "description": "User ID", - "name": "userID", - "in": "path", - "required": true - } - ], - "responses": { - "201": { - "description": "Created" - }, - "400": { - "description": "Bad Request", - "schema": {} - }, - "401": { - "description": "Unauthorized", - "schema": {} - }, - "404": { - "description": "Not Found", - "schema": {} - }, - "500": { - "description": "Internal Server Error", - "schema": {} - } - } - } - } - }, - "definitions": { - "models.Category": { - "type": "object", - "required": ["name"], - "properties": { - "created_at": { - "type": "string", - "example": "2023-09-20T16:34:50Z" - }, - "id": { - "type": "string", - "example": "123e4567-e89b-12d3-a456-426614174000" - }, - "name": { - "type": "string", - "maxLength": 255 - }, - "updated_at": { - "type": "string", - "example": "2023-09-20T16:34:50Z" - } - } - }, - "categories.CategoryRequestBody": { - "type": "object", - "required": ["name"], - "properties": { - "name": { - "type": "string", - "maxLength": 255 - } - } - }, - "models.Club": { - "type": "object", - "required": [ - "application_link", - "description", - "is_recruiting", - "name", - "num_members", - "preview", - "recruitment_cycle", - "recruitment_type" - ], - "properties": { - "application_link": { - "type": "string", - "maxLength": 255 - }, - "created_at": { - "type": "string", - "example": "2023-09-20T16:34:50Z" - }, - "description": { - "type": "string", - "maxLength": 255 - }, - "id": { - "type": "string", - "example": "123e4567-e89b-12d3-a456-426614174000" - }, - "is_recruiting": { - "type": "boolean" - }, - "logo": { - "type": "string", - "maxLength": 255 - }, - "name": { - "type": "string", - "maxLength": 255 - }, - "num_members": { - "type": "integer", - "minimum": 1 - }, - "one_word_to_describe_us": { - "type": "string", - "maxLength": 255 - }, - "preview": { - "type": "string", - "maxLength": 255 - }, - "recruitment_cycle": { - "maxLength": 255, - "enum": ["fall", "spring", "fallSpring", "always"], - "allOf": [ - { - "$ref": "#/definitions/models.RecruitmentCycle" - } - ] - }, - "recruitment_type": { - "maxLength": 255, - "enum": ["unrestricted", "tryout", "application"], - "allOf": [ - { - "$ref": "#/definitions/models.RecruitmentType" - } - ] - }, - "updated_at": { - "type": "string", - "example": "2023-09-20T16:34:50Z" - }, - "weekly_time_commitment": { - "type": "integer", - "minimum": 1 - } - } - }, - "models.College": { - "type": "string", - "enum": ["CAMD", "DMSB", "KCCS", "CE", "BCHS", "SL", "CPS", "CS", "CSSH"], - "x-enum-comments": { - "BCHS": "Bouvé College of Health Sciences", - "CAMD": "College of Arts, Media and Design", - "CE": "College of Engineering", - "CPS": "College of Professional Studies", - "CS": "College of Science", - "CSSH": "College of Social Sciences and Humanities", - "DMSB": "D'Amore-McKim School of Business", - "KCCS": "Khoury College of Computer Sciences", - "SL": "School of Law" - }, - "x-enum-varnames": [ - "CAMD", - "DMSB", - "KCCS", - "CE", - "BCHS", - "SL", - "CPS", - "CS", - "CSSH" - ] - }, - "models.Contact": { - "type": "object", - "required": ["content", "type"], - "properties": { - "content": { - "type": "string", - "maxLength": 255 - }, - "created_at": { - "type": "string", - "example": "2023-09-20T16:34:50Z" - }, - "id": { - "type": "string", - "example": "123e4567-e89b-12d3-a456-426614174000" - }, - "type": { - "maxLength": 255, - "enum": [ - "facebook", - "instagram", - "x", - "linkedin", - "youtube", - "github", - "slack", - "discord", - "email", - "customSite" - ], - "allOf": [ - { - "$ref": "#/definitions/models.ContactType" - } - ] - }, - "updated_at": { - "type": "string", - "example": "2023-09-20T16:34:50Z" - } - } - }, - "models.ContactType": { - "type": "string", - "enum": [ - "facebook", - "instagram", - "x", - "linkedin", - "youtube", - "github", - "slack", - "discord", - "email", - "customSite" - ], - "x-enum-varnames": [ - "Facebook", - "Instagram", - "X", - "LinkedIn", - "YouTube", - "GitHub", - "Slack", - "Discord", - "Email", - "CustomSite" - ] - }, - "CreateClubRequestBody": { - "type": "object", - "required": [ - "application_link", - "description", - "is_recruiting", - "name", - "preview", - "recruitment_cycle", - "recruitment_type", - "user_id" - ], - "properties": { - "application_link": { - "type": "string", - "maxLength": 255 - }, - "description": { - "type": "string", - "maxLength": 255 - }, - "is_recruiting": { - "type": "boolean" - }, - "logo": { - "type": "string", - "maxLength": 255 - }, - "name": { - "type": "string", - "maxLength": 255 - }, - "one_word_to_describe_us": { - "type": "string", - "maxLength": 255 - }, - "preview": { - "type": "string", - "maxLength": 255 - }, - "recruitment_cycle": { - "maxLength": 255, - "enum": ["fall", "spring", "fallSpring", "always"], - "allOf": [ - { - "$ref": "#/definitions/models.RecruitmentCycle" - } - ] - }, - "recruitment_type": { - "maxLength": 255, - "enum": ["unrestricted", "tryout", "application"], - "allOf": [ - { - "$ref": "#/definitions/models.RecruitmentType" - } - ] - }, - "user_id": { - "type": "string" - }, - "weekly_time_commitment": { - "type": "integer", - "minimum": 1 - } - } - }, - "CreateClubTagsRequestBody": { - "type": "object", - "required": ["tags"], - "properties": { - "tags": { - "type": "array", - "items": { - "type": "string" - } - } - } - }, - "events.CreateEventRequestBody": { - "type": "object", - "required": [ - "content", - "end_time", - "event_type", - "host", - "is_recurring", - "location", - "name", - "preview", - "start_time" - ], - "properties": { - "content": { - "type": "string", - "maxLength": 255 - }, - "end_time": { - "type": "string" - }, - "event_type": { - "maxLength": 255, - "enum": ["open", "membersOnly"], - "allOf": [ - { - "$ref": "#/definitions/models.EventType" - } - ] - }, - "host": { - "description": "TODO club/tag/notification logic", - "type": "string" - }, - "is_recurring": { - "type": "boolean" - }, - "location": { - "type": "string", - "maxLength": 255 - }, - "name": { - "type": "string", - "maxLength": 255 - }, - "preview": { - "type": "string", - "maxLength": 255 - }, - "series": { - "description": "TODO validate if isRecurring, then series is required", - "allOf": [ - { - "$ref": "#/definitions/models.CreateSeriesRequestBody" - } - ] - }, - "start_time": { - "type": "string" - } - } - }, - "CreateFileRequestBody": { - "type": "object", - "required": ["owner_id", "owner_type"], - "properties": { - "owner_id": { - "type": "string" - }, - "owner_type": { - "type": "string", - "maxLength": 255 - } - } - }, - "models.CreateSeriesRequestBody": { - "type": "object", - "required": ["max_occurrences", "recurring_type"], - "properties": { - "max_occurrences": { - "type": "integer", - "minimum": 2 - }, - "recurring_type": { - "maxLength": 255, - "enum": ["daily", "weekly", "monthly"], - "allOf": [ - { - "$ref": "#/definitions/models.RecurringType" - } - ] - } - } - }, - "CreateTagRequestBody": { - "type": "object", - "required": ["category_id", "name"], - "properties": { - "category_id": { - "type": "string" - }, - "name": { - "type": "string", - "maxLength": 255 - } - } - }, - "CreateUserRequestBody": { - "type": "object", - "required": ["email", "first_name", "last_name", "password"], - "properties": { - "college": { - "enum": [ - "CAMD", - "DMSB", - "KCCS", - "CE", - "BCHS", - "SL", - "CPS", - "CS", - "CSSH" - ], - "allOf": [ - { - "$ref": "#/definitions/models.College" - } - ] - }, - "email": { - "type": "string", - "maxLength": 255 - }, - "first_name": { - "type": "string", - "maxLength": 255 - }, - "graduation_cycle": { - "maxLength": 255, - "enum": ["december", "may"], - "allOf": [ - { - "$ref": "#/definitions/models.GraduationCycle" - } - ] - }, - "graduation_year": { - "type": "integer" - }, - "last_name": { - "type": "string", - "maxLength": 255 - }, - "major0": { - "description": "Optional fields", - "maxLength": 255, - "enum": [ - "africanaStudies", - "americanSignLanguage", - "americanSignLanguage-EnglishInterpreting", - "appliedPhysics", - "architecturalStudies", - "architecture", - "art:ArtVisualStudies", - "behavioralNeuroscience", - "biochemistry", - "bioengineering", - "biology", - "biomedicalPhysics", - "businessAdministration", - "businessAdministration:Accounting", - "businessAdministration:AccountingAndAdvisoryServices", - "businessAdministration:BrandManagement", - "businessAdministration:BusinessAnalytics", - "businessAdministration:CorporateInnovation", - "businessAdministration:EntrepreneurialStartups", - "businessAdministration:FamilyBusiness", - "businessAdministration:Finance", - "businessAdministration:Fintech", - "businessAdministration:HealthcareManagementAndConsulting", - "businessAdministration:Management", - "businessAdministration:ManagementInformationSystems", - "businessAdministration:Marketing", - "businessAdministration:MarketingAnalytics", - "businessAdministration:SocialInnovationAndEntrepreneurship", - "businessAdministration:SupplyChainManagement", - "cellAndMolecularBiology", - "chemicalEngineering", - "chemistry", - "civilEngineering", - "communicationStudies", - "computerEngineering", - "computerScience", - "computingAndLaw", - "criminologyAndCriminalJustice", - "culturalAnthropology", - "cybersecurity", - "dataScience", - "design", - "economics", - "electricalEngineering", - "english", - "environmentalAndSustainabilityStudies", - "environmentalEngineering", - "environmentalScience", - "environmentalStudies", - "gameArtAndAnimation", - "gameDesign", - "globalAsianStudies", - "healthScience", - "history", - "historyCultureAndLaw", - "humanServices", - "industrialEngineering", - "internationalAffairs", - "internationalBusiness", - "internationalBusiness:Accounting", - "internationalBusiness:AccountingAndAdvisoryServices", - "internationalBusiness:BrandManagement", - "internationalBusiness:BusinessAnalytics", - "internationalBusiness:CorporateInnovation", - "internationalBusiness:EntrepreneurialStartups", - "internationalBusiness:FamilyBusiness", - "internationalBusiness:Finance", - "internationalBusiness:Fintech", - "internationalBusiness:HealthcareManagementAndConsulting", - "internationalBusiness:Management", - "internationalBusiness:ManagementInformationSystems", - "internationalBusiness:Marketing", - "internationalBusiness:MarketingAnalytics", - "internationalBusiness:SocialInnovationAndEntrepreneurship", - "internationalBusiness:SupplyChainManagement", - "journalism", - "landscapeArchitecture", - "linguistics", - "marineBiology", - "mathematics", - "mechanicalEngineering", - "mediaAndScreenStudies", - "mediaArts", - "music", - "musicTechnology", - "nursing", - "pharmaceuticalSciences", - "pharmacy(PharmD)", - "philosophy", - "physics", - "politicalScience", - "politicsPhilosophyEconomics", - "psychology", - "publicHealth", - "publicRelations", - "religiousStudies", - "sociology", - "spanish", - "speechLanguagePathologyAndAudiology", - "theatre" - ], - "allOf": [ - { - "$ref": "#/definitions/models.Major" - } - ] - }, - "major1": { - "maxLength": 255, - "enum": [ - "africanaStudies", - "americanSignLanguage", - "americanSignLanguage-EnglishInterpreting", - "appliedPhysics", - "architecturalStudies", - "architecture", - "art:ArtVisualStudies", - "behavioralNeuroscience", - "biochemistry", - "bioengineering", - "biology", - "biomedicalPhysics", - "businessAdministration", - "businessAdministration:Accounting", - "businessAdministration:AccountingAndAdvisoryServices", - "businessAdministration:BrandManagement", - "businessAdministration:BusinessAnalytics", - "businessAdministration:CorporateInnovation", - "businessAdministration:EntrepreneurialStartups", - "businessAdministration:FamilyBusiness", - "businessAdministration:Finance", - "businessAdministration:Fintech", - "businessAdministration:HealthcareManagementAndConsulting", - "businessAdministration:Management", - "businessAdministration:ManagementInformationSystems", - "businessAdministration:Marketing", - "businessAdministration:MarketingAnalytics", - "businessAdministration:SocialInnovationAndEntrepreneurship", - "businessAdministration:SupplyChainManagement", - "cellAndMolecularBiology", - "chemicalEngineering", - "chemistry", - "civilEngineering", - "communicationStudies", - "computerEngineering", - "computerScience", - "computingAndLaw", - "criminologyAndCriminalJustice", - "culturalAnthropology", - "cybersecurity", - "dataScience", - "design", - "economics", - "electricalEngineering", - "english", - "environmentalAndSustainabilityStudies", - "environmentalEngineering", - "environmentalScience", - "environmentalStudies", - "gameArtAndAnimation", - "gameDesign", - "globalAsianStudies", - "healthScience", - "history", - "historyCultureAndLaw", - "humanServices", - "industrialEngineering", - "internationalAffairs", - "internationalBusiness", - "internationalBusiness:Accounting", - "internationalBusiness:AccountingAndAdvisoryServices", - "internationalBusiness:BrandManagement", - "internationalBusiness:BusinessAnalytics", - "internationalBusiness:CorporateInnovation", - "internationalBusiness:EntrepreneurialStartups", - "internationalBusiness:FamilyBusiness", - "internationalBusiness:Finance", - "internationalBusiness:Fintech", - "internationalBusiness:HealthcareManagementAndConsulting", - "internationalBusiness:Management", - "internationalBusiness:ManagementInformationSystems", - "internationalBusiness:Marketing", - "internationalBusiness:MarketingAnalytics", - "internationalBusiness:SocialInnovationAndEntrepreneurship", - "internationalBusiness:SupplyChainManagement", - "journalism", - "landscapeArchitecture", - "linguistics", - "marineBiology", - "mathematics", - "mechanicalEngineering", - "mediaAndScreenStudies", - "mediaArts", - "music", - "musicTechnology", - "nursing", - "pharmaceuticalSciences", - "pharmacy(PharmD)", - "philosophy", - "physics", - "politicalScience", - "politicsPhilosophyEconomics", - "psychology", - "publicHealth", - "publicRelations", - "religiousStudies", - "sociology", - "spanish", - "speechLanguagePathologyAndAudiology", - "theatre" - ], - "allOf": [ - { - "$ref": "#/definitions/models.Major" - } - ] - }, - "major2": { - "maxLength": 255, - "enum": [ - "africanaStudies", - "americanSignLanguage", - "americanSignLanguage-EnglishInterpreting", - "appliedPhysics", - "architecturalStudies", - "architecture", - "art:ArtVisualStudies", - "behavioralNeuroscience", - "biochemistry", - "bioengineering", - "biology", - "biomedicalPhysics", - "businessAdministration", - "businessAdministration:Accounting", - "businessAdministration:AccountingAndAdvisoryServices", - "businessAdministration:BrandManagement", - "businessAdministration:BusinessAnalytics", - "businessAdministration:CorporateInnovation", - "businessAdministration:EntrepreneurialStartups", - "businessAdministration:FamilyBusiness", - "businessAdministration:Finance", - "businessAdministration:Fintech", - "businessAdministration:HealthcareManagementAndConsulting", - "businessAdministration:Management", - "businessAdministration:ManagementInformationSystems", - "businessAdministration:Marketing", - "businessAdministration:MarketingAnalytics", - "businessAdministration:SocialInnovationAndEntrepreneurship", - "businessAdministration:SupplyChainManagement", - "cellAndMolecularBiology", - "chemicalEngineering", - "chemistry", - "civilEngineering", - "communicationStudies", - "computerEngineering", - "computerScience", - "computingAndLaw", - "criminologyAndCriminalJustice", - "culturalAnthropology", - "cybersecurity", - "dataScience", - "design", - "economics", - "electricalEngineering", - "english", - "environmentalAndSustainabilityStudies", - "environmentalEngineering", - "environmentalScience", - "environmentalStudies", - "gameArtAndAnimation", - "gameDesign", - "globalAsianStudies", - "healthScience", - "history", - "historyCultureAndLaw", - "humanServices", - "industrialEngineering", - "internationalAffairs", - "internationalBusiness", - "internationalBusiness:Accounting", - "internationalBusiness:AccountingAndAdvisoryServices", - "internationalBusiness:BrandManagement", - "internationalBusiness:BusinessAnalytics", - "internationalBusiness:CorporateInnovation", - "internationalBusiness:EntrepreneurialStartups", - "internationalBusiness:FamilyBusiness", - "internationalBusiness:Finance", - "internationalBusiness:Fintech", - "internationalBusiness:HealthcareManagementAndConsulting", - "internationalBusiness:Management", - "internationalBusiness:ManagementInformationSystems", - "internationalBusiness:Marketing", - "internationalBusiness:MarketingAnalytics", - "internationalBusiness:SocialInnovationAndEntrepreneurship", - "internationalBusiness:SupplyChainManagement", - "journalism", - "landscapeArchitecture", - "linguistics", - "marineBiology", - "mathematics", - "mechanicalEngineering", - "mediaAndScreenStudies", - "mediaArts", - "music", - "musicTechnology", - "nursing", - "pharmaceuticalSciences", - "pharmacy(PharmD)", - "philosophy", - "physics", - "politicalScience", - "politicsPhilosophyEconomics", - "psychology", - "publicHealth", - "publicRelations", - "religiousStudies", - "sociology", - "spanish", - "speechLanguagePathologyAndAudiology", - "theatre" - ], - "allOf": [ - { - "$ref": "#/definitions/models.Major" - } - ] - }, - "password": { - "description": "MARK: must be validated manually", - "type": "string", - "maxLength": 255 - } - } - }, - "models.Event": { - "type": "object", - "required": [ - "content", - "end_time", - "event_type", - "location", - "name", - "preview", - "start_time" - ], - "properties": { - "content": { - "type": "string", - "maxLength": 255 - }, - "created_at": { - "type": "string", - "example": "2023-09-20T16:34:50Z" - }, - "end_time": { - "type": "string" - }, - "event_type": { - "maxLength": 255, - "enum": ["open", "membersOnly"], - "allOf": [ - { - "$ref": "#/definitions/models.EventType" - } - ] - }, - "host": { - "type": "string" - }, - "id": { - "type": "string", - "example": "123e4567-e89b-12d3-a456-426614174000" - }, - "is_recurring": { - "type": "boolean" - }, - "location": { - "type": "string", - "maxLength": 255 - }, - "meeting_link": { - "type": "string" - }, - "name": { - "type": "string", - "maxLength": 255 - }, - "preview": { - "type": "string", - "maxLength": 255 - }, - "start_time": { - "type": "string" - }, - "updated_at": { - "type": "string", - "example": "2023-09-20T16:34:50Z" - } - } - }, - "models.EventType": { - "type": "string", - "enum": ["open", "membersOnly"], - "x-enum-varnames": ["Open", "MembersOnly"] - }, - "models.File": { - "type": "object", - "required": [ - "file_name", - "file_size", - "file_type", - "file_url", - "object_key" - ], - "properties": { - "created_at": { - "type": "string", - "example": "2023-09-20T16:34:50Z" - }, - "file_name": { - "type": "string", - "maxLength": 255 - }, - "file_size": { - "type": "integer", - "minimum": 1 - }, - "file_type": { - "type": "string", - "maxLength": 255 - }, - "file_url": { - "type": "string", - "maxLength": 255 - }, - "id": { - "type": "string", - "example": "123e4567-e89b-12d3-a456-426614174000" - }, - "object_key": { - "type": "string", - "maxLength": 255 - }, - "updated_at": { - "type": "string", - "example": "2023-09-20T16:34:50Z" - } - } - }, - "models.GraduationCycle": { - "type": "string", - "enum": ["december", "may"], - "x-enum-varnames": ["December", "May"] - }, - "models.LoginResponseBody": { - "type": "object", - "required": ["email", "password"], - "properties": { - "email": { - "type": "string" - }, - "password": { - "description": "MARK: must be validated manually", - "type": "string", - "maxLength": 255 - } - } - }, - "models.Major": { - "type": "string", - "enum": [ - "africanaStudies", - "americanSignLanguage", - "americanSignLanguage-EnglishInterpreting", - "appliedPhysics", - "architecturalStudies", - "architecture", - "art:ArtVisualStudies", - "behavioralNeuroscience", - "biochemistry", - "bioengineering", - "biology", - "biomedicalPhysics", - "businessAdministration", - "businessAdministration:Accounting", - "businessAdministration:AccountingAndAdvisoryServices", - "businessAdministration:BrandManagement", - "businessAdministration:BusinessAnalytics", - "businessAdministration:CorporateInnovation", - "businessAdministration:EntrepreneurialStartups", - "businessAdministration:FamilyBusiness", - "businessAdministration:Finance", - "businessAdministration:Fintech", - "businessAdministration:HealthcareManagementAndConsulting", - "businessAdministration:Management", - "businessAdministration:ManagementInformationSystems", - "businessAdministration:Marketing", - "businessAdministration:MarketingAnalytics", - "businessAdministration:SocialInnovationAndEntrepreneurship", - "businessAdministration:SupplyChainManagement", - "cellAndMolecularBiology", - "chemicalEngineering", - "chemistry", - "civilEngineering", - "communicationStudies", - "computerEngineering", - "computerScience", - "computingAndLaw", - "criminologyAndCriminalJustice", - "culturalAnthropology", - "cybersecurity", - "dataScience", - "design", - "economics", - "electricalEngineering", - "english", - "environmentalAndSustainabilityStudies", - "environmentalEngineering", - "environmentalScience", - "environmentalStudies", - "gameArtAndAnimation", - "gameDesign", - "globalAsianStudies", - "healthScience", - "history", - "historyCultureAndLaw", - "humanServices", - "industrialEngineering", - "internationalAffairs", - "internationalBusiness", - "internationalBusiness:Accounting", - "internationalBusiness:AccountingAndAdvisoryServices", - "internationalBusiness:BrandManagement", - "internationalBusiness:BusinessAnalytics", - "internationalBusiness:CorporateInnovation", - "internationalBusiness:EntrepreneurialStartups", - "internationalBusiness:FamilyBusiness", - "internationalBusiness:Finance", - "internationalBusiness:Fintech", - "internationalBusiness:HealthcareManagementAndConsulting", - "internationalBusiness:Management", - "internationalBusiness:ManagementInformationSystems", - "internationalBusiness:Marketing", - "internationalBusiness:MarketingAnalytics", - "internationalBusiness:SocialInnovationAndEntrepreneurship", - "internationalBusiness:SupplyChainManagement", - "journalism", - "landscapeArchitecture", - "linguistics", - "marineBiology", - "mathematics", - "mechanicalEngineering", - "mediaAndScreenStudies", - "mediaArts", - "music", - "musicTechnology", - "nursing", - "pharmaceuticalSciences", - "pharmacy(PharmD)", - "philosophy", - "physics", - "politicalScience", - "politicsPhilosophyEconomics", - "psychology", - "publicHealth", - "publicRelations", - "religiousStudies", - "sociology", - "spanish", - "speechLanguagePathologyAndAudiology", - "theatre" - ], - "x-enum-varnames": [ - "AfricanaStudies", - "AmericanSignLanguage", - "AmericanSignLanguageEnglishInterpreting", - "AppliedPhysics", - "ArchitecturalStudies", - "Architecture", - "ArtArtVisualStudies", - "BehavioralNeuroscience", - "Biochemistry", - "Bioengineering", - "Biology", - "BiomedicalPhysics", - "BusinessAdministration", - "BusinessAdministrationAccounting", - "BusinessAdministrationAccountingAndAdvisoryServices", - "BusinessAdministrationBrandManagement", - "BusinessAdministrationBusinessAnalytics", - "BusinessAdministrationCorporateInnovation", - "BusinessAdministrationEntrepreneurialStartups", - "BusinessAdministrationFamilyBusiness", - "BusinessAdministrationFinance", - "BusinessAdministrationFintech", - "BusinessAdministrationHealthcareManagementAndConsulting", - "BusinessAdministrationManagement", - "BusinessAdministrationManagementInformationSystems", - "BusinessAdministrationMarketing", - "BusinessAdministrationMarketingAnalytics", - "BusinessAdministrationSocialInnovationAndEntrepreneurship", - "BusinessAdministrationSupplyChainManagement", - "CellAndMolecularBiology", - "ChemicalEngineering", - "Chemistry", - "CivilEngineering", - "CommunicationStudies", - "ComputerEngineering", - "ComputerScience", - "ComputingAndLaw", - "CriminologyAndCriminalJustice", - "CulturalAnthropology", - "Cybersecurity", - "DataScience", - "Design", - "Economics", - "ElectricalEngineering", - "English", - "EnvironmentalAndSustainabilityStudies", - "EnvironmentalEngineering", - "EnvironmentalScience", - "EnvironmentalStudies", - "GameArtAndAnimation", - "GameDesign", - "GlobalAsianStudies", - "HealthScience", - "History", - "HistoryCultureAndLaw", - "HumanServices", - "IndustrialEngineering", - "InternationalAffairs", - "InternationalBusiness", - "InternationalBusinessAccounting", - "InternationalBusinessAccountingAndAdvisoryServices", - "InternationalBusinessBrandManagement", - "InternationalBusinessBusinessAnalytics", - "InternationalBusinessCorporateInnovation", - "InternationalBusinessEntrepreneurialStartups", - "InternationalBusinessFamilyBusiness", - "InternationalBusinessFinance", - "InternationalBusinessFintech", - "InternationalBusinessHealthcareManagementAndConsulting", - "InternationalBusinessManagement", - "InternationalBusinessManagementInformationSystems", - "InternationalBusinessMarketing", - "InternationalBusinessMarketingAnalytics", - "InternationalBusinessSocialInnovationAndEntrepreneurship", - "InternationalBusinessSupplyChainManagement", - "Journalism", - "LandscapeArchitecture", - "Linguistics", - "MarineBiology", - "Mathematics", - "MechanicalEngineering", - "MediaAndScreenStudies", - "MediaArts", - "Music", - "MusicTechnology", - "Nursing", - "PharmaceuticalSciences", - "PharmacyPharmD", - "Philosophy", - "Physics", - "PoliticalScience", - "PoliticsPhilosophyEconomics", - "Psychology", - "PublicHealth", - "PublicRelations", - "ReligiousStudies", - "Sociology", - "Spanish", - "SpeechLanguagePathologyAndAudiology", - "Theatre" - ] - }, - "models.PointOfContact": { - "type": "object", - "required": ["email", "name", "position"], - "properties": { - "created_at": { - "type": "string", - "example": "2023-09-20T16:34:50Z" - }, - "email": { - "type": "string", - "maxLength": 255 - }, - "id": { - "type": "string", - "example": "123e4567-e89b-12d3-a456-426614174000" - }, - "name": { - "type": "string", - "maxLength": 255 - }, - "photo_file": { - "$ref": "#/definitions/models.File" - }, - "position": { - "type": "string", - "maxLength": 255 - }, - "updated_at": { - "type": "string", - "example": "2023-09-20T16:34:50Z" - } - } - }, - "PutContactRequestBody": { - "type": "object", - "required": ["content", "type"], - "properties": { - "content": { - "type": "string", - "maxLength": 255 - }, - "type": { - "maxLength": 255, - "enum": [ - "facebook", - "instagram", - "x", - "linkedin", - "youtube", - "github", - "slack", - "discord", - "email", - "customSite" - ], - "allOf": [ - { - "$ref": "#/definitions/models.ContactType" - } - ] - } - } - }, - "models.RecruitmentCycle": { - "type": "string", - "enum": ["fall", "spring", "fallSpring", "always"], - "x-enum-varnames": ["Fall", "Spring", "FallSpring", "Always"] - }, - "models.RecruitmentType": { - "type": "string", - "enum": ["unrestricted", "tryout", "application"], - "x-enum-varnames": ["Unrestricted", "Tryout", "Application"] - }, - "models.RecurringType": { - "type": "string", - "enum": ["daily", "weekly", "monthly"], - "x-enum-varnames": ["Daily", "Weekly", "Monthly"] - }, - "models.Series": { - "type": "object", - "properties": { - "created_at": { - "type": "string", - "example": "2023-09-20T16:34:50Z" - }, - "events": { - "type": "array", - "items": { - "$ref": "#/definitions/models.Event" - } - }, - "id": { - "type": "string", - "example": "123e4567-e89b-12d3-a456-426614174000" - }, - "max_occurrences": { - "type": "integer", - "minimum": 1 - }, - "recurring_type": { - "maxLength": 255, - "allOf": [ - { - "$ref": "#/definitions/models.RecurringType" - } - ] - }, - "updated_at": { - "type": "string", - "example": "2023-09-20T16:34:50Z" - } - } - }, - "models.Tag": { - "type": "object", - "required": ["category_id", "name"], - "properties": { - "category_id": { - "type": "string" - }, - "created_at": { - "type": "string", - "example": "2023-09-20T16:34:50Z" - }, - "id": { - "type": "string", - "example": "123e4567-e89b-12d3-a456-426614174000" - }, - "name": { - "type": "string", - "maxLength": 255 - }, - "updated_at": { - "type": "string", - "example": "2023-09-20T16:34:50Z" - } - } - }, - "UpdateClubRequestBody": { - "type": "object", - "required": ["application_link", "recruitment_cycle", "recruitment_type"], - "properties": { - "application_link": { - "type": "string", - "maxLength": 255 - }, - "description": { - "type": "string", - "maxLength": 255 - }, - "is_recruiting": { - "type": "boolean" - }, - "logo": { - "type": "string", - "maxLength": 255 - }, - "name": { - "type": "string", - "maxLength": 255 - }, - "one_word_to_describe_us": { - "type": "string", - "maxLength": 255 - }, - "preview": { - "type": "string", - "maxLength": 255 - }, - "recruitment_cycle": { - "maxLength": 255, - "enum": ["fall", "spring", "fallSpring", "always"], - "allOf": [ - { - "$ref": "#/definitions/models.RecruitmentCycle" - } - ] - }, - "recruitment_type": { - "maxLength": 255, - "enum": ["unrestricted", "tryout", "application"], - "allOf": [ - { - "$ref": "#/definitions/models.RecruitmentType" - } - ] - }, - "weekly_time_commitment": { - "type": "integer", - "minimum": 1 - } - } - }, - "events.UpdateEventRequestBody": { - "type": "object", - "properties": { - "content": { - "type": "string", - "maxLength": 255 - }, - "end_time": { - "type": "string" - }, - "event_type": { - "maxLength": 255, - "enum": ["open", "membersOnly"], - "allOf": [ - { - "$ref": "#/definitions/models.EventType" - } - ] - }, - "host": { - "type": "string" - }, - "location": { - "type": "string", - "maxLength": 255 - }, - "name": { - "type": "string", - "maxLength": 255 - }, - "preview": { - "type": "string", - "maxLength": 255 - }, - "start_time": { - "type": "string" - } - } - }, - "models.UpdatePasswordRequestBody": { - "type": "object", - "required": ["new_password", "old_password"], - "properties": { - "new_password": { - "description": "MARK: must be validated manually", - "type": "string", - "maxLength": 255 - }, - "old_password": { - "description": "MARK: must be validated manually", - "type": "string", - "maxLength": 255 - } - } - }, - "models.UpdateSeriesRequestBody": { - "type": "object", - "properties": { - "event_details": { - "$ref": "#/definitions/events.UpdateEventRequestBody" - }, - "max_occurrences": { - "type": "integer", - "minimum": 2 - }, - "recurring_type": { - "maxLength": 255, - "enum": ["daily", "weekly", "monthly"], - "allOf": [ - { - "$ref": "#/definitions/models.RecurringType" - } - ] - } - } - }, - "UpdateTagRequestBody": { - "type": "object", - "properties": { - "category_id": { - "type": "string" - }, - "name": { - "type": "string", - "maxLength": 255 - } - } - }, - "UpdateUserRequestBody": { - "type": "object", - "properties": { - "college": { - "enum": [ - "CAMD", - "DMSB", - "KCCS", - "CE", - "BCHS", - "SL", - "CPS", - "CS", - "CSSH" - ], - "allOf": [ - { - "$ref": "#/definitions/models.College" - } - ] - }, - "first_name": { - "type": "string", - "maxLength": 255 - }, - "graduation_cycle": { - "maxLength": 255, - "enum": ["december", "may"], - "allOf": [ - { - "$ref": "#/definitions/models.GraduationCycle" - } - ] - }, - "graduation_year": { - "type": "integer" - }, - "last_name": { - "type": "string", - "maxLength": 255 - }, - "major0": { - "maxLength": 255, - "enum": [ - "africanaStudies", - "americanSignLanguage", - "americanSignLanguage-EnglishInterpreting", - "appliedPhysics", - "architecturalStudies", - "architecture", - "art:ArtVisualStudies", - "behavioralNeuroscience", - "biochemistry", - "bioengineering", - "biology", - "biomedicalPhysics", - "businessAdministration", - "businessAdministration:Accounting", - "businessAdministration:AccountingAndAdvisoryServices", - "businessAdministration:BrandManagement", - "businessAdministration:BusinessAnalytics", - "businessAdministration:CorporateInnovation", - "businessAdministration:EntrepreneurialStartups", - "businessAdministration:FamilyBusiness", - "businessAdministration:Finance", - "businessAdministration:Fintech", - "businessAdministration:HealthcareManagementAndConsulting", - "businessAdministration:Management", - "businessAdministration:ManagementInformationSystems", - "businessAdministration:Marketing", - "businessAdministration:MarketingAnalytics", - "businessAdministration:SocialInnovationAndEntrepreneurship", - "businessAdministration:SupplyChainManagement", - "cellAndMolecularBiology", - "chemicalEngineering", - "chemistry", - "civilEngineering", - "communicationStudies", - "computerEngineering", - "computerScience", - "computingAndLaw", - "criminologyAndCriminalJustice", - "culturalAnthropology", - "cybersecurity", - "dataScience", - "design", - "economics", - "electricalEngineering", - "english", - "environmentalAndSustainabilityStudies", - "environmentalEngineering", - "environmentalScience", - "environmentalStudies", - "gameArtAndAnimation", - "gameDesign", - "globalAsianStudies", - "healthScience", - "history", - "historyCultureAndLaw", - "humanServices", - "industrialEngineering", - "internationalAffairs", - "internationalBusiness", - "internationalBusiness:Accounting", - "internationalBusiness:AccountingAndAdvisoryServices", - "internationalBusiness:BrandManagement", - "internationalBusiness:BusinessAnalytics", - "internationalBusiness:CorporateInnovation", - "internationalBusiness:EntrepreneurialStartups", - "internationalBusiness:FamilyBusiness", - "internationalBusiness:Finance", - "internationalBusiness:Fintech", - "internationalBusiness:HealthcareManagementAndConsulting", - "internationalBusiness:Management", - "internationalBusiness:ManagementInformationSystems", - "internationalBusiness:Marketing", - "internationalBusiness:MarketingAnalytics", - "internationalBusiness:SocialInnovationAndEntrepreneurship", - "internationalBusiness:SupplyChainManagement", - "journalism", - "landscapeArchitecture", - "linguistics", - "marineBiology", - "mathematics", - "mechanicalEngineering", - "mediaAndScreenStudies", - "mediaArts", - "music", - "musicTechnology", - "nursing", - "pharmaceuticalSciences", - "pharmacy(PharmD)", - "philosophy", - "physics", - "politicalScience", - "politicsPhilosophyEconomics", - "psychology", - "publicHealth", - "publicRelations", - "religiousStudies", - "sociology", - "spanish", - "speechLanguagePathologyAndAudiology", - "theatre" - ], - "allOf": [ - { - "$ref": "#/definitions/models.Major" - } - ] - }, - "major1": { - "maxLength": 255, - "enum": [ - "africanaStudies", - "americanSignLanguage", - "americanSignLanguage-EnglishInterpreting", - "appliedPhysics", - "architecturalStudies", - "architecture", - "art:ArtVisualStudies", - "behavioralNeuroscience", - "biochemistry", - "bioengineering", - "biology", - "biomedicalPhysics", - "businessAdministration", - "businessAdministration:Accounting", - "businessAdministration:AccountingAndAdvisoryServices", - "businessAdministration:BrandManagement", - "businessAdministration:BusinessAnalytics", - "businessAdministration:CorporateInnovation", - "businessAdministration:EntrepreneurialStartups", - "businessAdministration:FamilyBusiness", - "businessAdministration:Finance", - "businessAdministration:Fintech", - "businessAdministration:HealthcareManagementAndConsulting", - "businessAdministration:Management", - "businessAdministration:ManagementInformationSystems", - "businessAdministration:Marketing", - "businessAdministration:MarketingAnalytics", - "businessAdministration:SocialInnovationAndEntrepreneurship", - "businessAdministration:SupplyChainManagement", - "cellAndMolecularBiology", - "chemicalEngineering", - "chemistry", - "civilEngineering", - "communicationStudies", - "computerEngineering", - "computerScience", - "computingAndLaw", - "criminologyAndCriminalJustice", - "culturalAnthropology", - "cybersecurity", - "dataScience", - "design", - "economics", - "electricalEngineering", - "english", - "environmentalAndSustainabilityStudies", - "environmentalEngineering", - "environmentalScience", - "environmentalStudies", - "gameArtAndAnimation", - "gameDesign", - "globalAsianStudies", - "healthScience", - "history", - "historyCultureAndLaw", - "humanServices", - "industrialEngineering", - "internationalAffairs", - "internationalBusiness", - "internationalBusiness:Accounting", - "internationalBusiness:AccountingAndAdvisoryServices", - "internationalBusiness:BrandManagement", - "internationalBusiness:BusinessAnalytics", - "internationalBusiness:CorporateInnovation", - "internationalBusiness:EntrepreneurialStartups", - "internationalBusiness:FamilyBusiness", - "internationalBusiness:Finance", - "internationalBusiness:Fintech", - "internationalBusiness:HealthcareManagementAndConsulting", - "internationalBusiness:Management", - "internationalBusiness:ManagementInformationSystems", - "internationalBusiness:Marketing", - "internationalBusiness:MarketingAnalytics", - "internationalBusiness:SocialInnovationAndEntrepreneurship", - "internationalBusiness:SupplyChainManagement", - "journalism", - "landscapeArchitecture", - "linguistics", - "marineBiology", - "mathematics", - "mechanicalEngineering", - "mediaAndScreenStudies", - "mediaArts", - "music", - "musicTechnology", - "nursing", - "pharmaceuticalSciences", - "pharmacy(PharmD)", - "philosophy", - "physics", - "politicalScience", - "politicsPhilosophyEconomics", - "psychology", - "publicHealth", - "publicRelations", - "religiousStudies", - "sociology", - "spanish", - "speechLanguagePathologyAndAudiology", - "theatre" - ], - "allOf": [ - { - "$ref": "#/definitions/models.Major" - } - ] - }, - "major2": { - "maxLength": 255, - "enum": [ - "africanaStudies", - "americanSignLanguage", - "americanSignLanguage-EnglishInterpreting", - "appliedPhysics", - "architecturalStudies", - "architecture", - "art:ArtVisualStudies", - "behavioralNeuroscience", - "biochemistry", - "bioengineering", - "biology", - "biomedicalPhysics", - "businessAdministration", - "businessAdministration:Accounting", - "businessAdministration:AccountingAndAdvisoryServices", - "businessAdministration:BrandManagement", - "businessAdministration:BusinessAnalytics", - "businessAdministration:CorporateInnovation", - "businessAdministration:EntrepreneurialStartups", - "businessAdministration:FamilyBusiness", - "businessAdministration:Finance", - "businessAdministration:Fintech", - "businessAdministration:HealthcareManagementAndConsulting", - "businessAdministration:Management", - "businessAdministration:ManagementInformationSystems", - "businessAdministration:Marketing", - "businessAdministration:MarketingAnalytics", - "businessAdministration:SocialInnovationAndEntrepreneurship", - "businessAdministration:SupplyChainManagement", - "cellAndMolecularBiology", - "chemicalEngineering", - "chemistry", - "civilEngineering", - "communicationStudies", - "computerEngineering", - "computerScience", - "computingAndLaw", - "criminologyAndCriminalJustice", - "culturalAnthropology", - "cybersecurity", - "dataScience", - "design", - "economics", - "electricalEngineering", - "english", - "environmentalAndSustainabilityStudies", - "environmentalEngineering", - "environmentalScience", - "environmentalStudies", - "gameArtAndAnimation", - "gameDesign", - "globalAsianStudies", - "healthScience", - "history", - "historyCultureAndLaw", - "humanServices", - "industrialEngineering", - "internationalAffairs", - "internationalBusiness", - "internationalBusiness:Accounting", - "internationalBusiness:AccountingAndAdvisoryServices", - "internationalBusiness:BrandManagement", - "internationalBusiness:BusinessAnalytics", - "internationalBusiness:CorporateInnovation", - "internationalBusiness:EntrepreneurialStartups", - "internationalBusiness:FamilyBusiness", - "internationalBusiness:Finance", - "internationalBusiness:Fintech", - "internationalBusiness:HealthcareManagementAndConsulting", - "internationalBusiness:Management", - "internationalBusiness:ManagementInformationSystems", - "internationalBusiness:Marketing", - "internationalBusiness:MarketingAnalytics", - "internationalBusiness:SocialInnovationAndEntrepreneurship", - "internationalBusiness:SupplyChainManagement", - "journalism", - "landscapeArchitecture", - "linguistics", - "marineBiology", - "mathematics", - "mechanicalEngineering", - "mediaAndScreenStudies", - "mediaArts", - "music", - "musicTechnology", - "nursing", - "pharmaceuticalSciences", - "pharmacy(PharmD)", - "philosophy", - "physics", - "politicalScience", - "politicsPhilosophyEconomics", - "psychology", - "publicHealth", - "publicRelations", - "religiousStudies", - "sociology", - "spanish", - "speechLanguagePathologyAndAudiology", - "theatre" - ], - "allOf": [ - { - "$ref": "#/definitions/models.Major" - } - ] - } - } - }, - "models.User": { - "type": "object", - "required": [ - "college", - "email", - "first_name", - "graduation_cycle", - "graduation_year", - "last_name", - "major0", - "role" - ], - "properties": { - "college": { - "maxLength": 255, - "allOf": [ - { - "$ref": "#/definitions/models.College" - } - ] - }, - "created_at": { - "type": "string", - "example": "2023-09-20T16:34:50Z" - }, - "email": { - "type": "string", - "maxLength": 255 - }, - "first_name": { - "type": "string", - "maxLength": 255 - }, - "graduation_cycle": { - "maxLength": 255, - "enum": ["december", "may"], - "allOf": [ - { - "$ref": "#/definitions/models.GraduationCycle" - } - ] - }, - "graduation_year": { - "type": "integer" - }, - "id": { - "type": "string", - "example": "123e4567-e89b-12d3-a456-426614174000" - }, - "is_verified": { - "type": "boolean" - }, - "last_name": { - "type": "string", - "maxLength": 255 - }, - "major0": { - "maxLength": 255, - "enum": [ - "africanaStudies", - "americanSignLanguage", - "americanSignLanguage-EnglishInterpreting", - "appliedPhysics", - "architecturalStudies", - "architecture", - "art:ArtVisualStudies", - "behavioralNeuroscience", - "biochemistry", - "bioengineering", - "biology", - "biomedicalPhysics", - "businessAdministration", - "businessAdministration:Accounting", - "businessAdministration:AccountingAndAdvisoryServices", - "businessAdministration:BrandManagement", - "businessAdministration:BusinessAnalytics", - "businessAdministration:CorporateInnovation", - "businessAdministration:EntrepreneurialStartups", - "businessAdministration:FamilyBusiness", - "businessAdministration:Finance", - "businessAdministration:Fintech", - "businessAdministration:HealthcareManagementAndConsulting", - "businessAdministration:Management", - "businessAdministration:ManagementInformationSystems", - "businessAdministration:Marketing", - "businessAdministration:MarketingAnalytics", - "businessAdministration:SocialInnovationAndEntrepreneurship", - "businessAdministration:SupplyChainManagement", - "cellAndMolecularBiology", - "chemicalEngineering", - "chemistry", - "civilEngineering", - "communicationStudies", - "computerEngineering", - "computerScience", - "computingAndLaw", - "criminologyAndCriminalJustice", - "culturalAnthropology", - "cybersecurity", - "dataScience", - "design", - "economics", - "electricalEngineering", - "english", - "environmentalAndSustainabilityStudies", - "environmentalEngineering", - "environmentalScience", - "environmentalStudies", - "gameArtAndAnimation", - "gameDesign", - "globalAsianStudies", - "healthScience", - "history", - "historyCultureAndLaw", - "humanServices", - "industrialEngineering", - "internationalAffairs", - "internationalBusiness", - "internationalBusiness:Accounting", - "internationalBusiness:AccountingAndAdvisoryServices", - "internationalBusiness:BrandManagement", - "internationalBusiness:BusinessAnalytics", - "internationalBusiness:CorporateInnovation", - "internationalBusiness:EntrepreneurialStartups", - "internationalBusiness:FamilyBusiness", - "internationalBusiness:Finance", - "internationalBusiness:Fintech", - "internationalBusiness:HealthcareManagementAndConsulting", - "internationalBusiness:Management", - "internationalBusiness:ManagementInformationSystems", - "internationalBusiness:Marketing", - "internationalBusiness:MarketingAnalytics", - "internationalBusiness:SocialInnovationAndEntrepreneurship", - "internationalBusiness:SupplyChainManagement", - "journalism", - "landscapeArchitecture", - "linguistics", - "marineBiology", - "mathematics", - "mechanicalEngineering", - "mediaAndScreenStudies", - "mediaArts", - "music", - "musicTechnology", - "nursing", - "pharmaceuticalSciences", - "pharmacy(PharmD)", - "philosophy", - "physics", - "politicalScience", - "politicsPhilosophyEconomics", - "psychology", - "publicHealth", - "publicRelations", - "religiousStudies", - "sociology", - "spanish", - "speechLanguagePathologyAndAudiology", - "theatre" - ], - "allOf": [ - { - "$ref": "#/definitions/models.Major" - } - ] - }, - "major1": { - "maxLength": 255, - "enum": [ - "africanaStudies", - "americanSignLanguage", - "americanSignLanguage-EnglishInterpreting", - "appliedPhysics", - "architecturalStudies", - "architecture", - "art:ArtVisualStudies", - "behavioralNeuroscience", - "biochemistry", - "bioengineering", - "biology", - "biomedicalPhysics", - "businessAdministration", - "businessAdministration:Accounting", - "businessAdministration:AccountingAndAdvisoryServices", - "businessAdministration:BrandManagement", - "businessAdministration:BusinessAnalytics", - "businessAdministration:CorporateInnovation", - "businessAdministration:EntrepreneurialStartups", - "businessAdministration:FamilyBusiness", - "businessAdministration:Finance", - "businessAdministration:Fintech", - "businessAdministration:HealthcareManagementAndConsulting", - "businessAdministration:Management", - "businessAdministration:ManagementInformationSystems", - "businessAdministration:Marketing", - "businessAdministration:MarketingAnalytics", - "businessAdministration:SocialInnovationAndEntrepreneurship", - "businessAdministration:SupplyChainManagement", - "cellAndMolecularBiology", - "chemicalEngineering", - "chemistry", - "civilEngineering", - "communicationStudies", - "computerEngineering", - "computerScience", - "computingAndLaw", - "criminologyAndCriminalJustice", - "culturalAnthropology", - "cybersecurity", - "dataScience", - "design", - "economics", - "electricalEngineering", - "english", - "environmentalAndSustainabilityStudies", - "environmentalEngineering", - "environmentalScience", - "environmentalStudies", - "gameArtAndAnimation", - "gameDesign", - "globalAsianStudies", - "healthScience", - "history", - "historyCultureAndLaw", - "humanServices", - "industrialEngineering", - "internationalAffairs", - "internationalBusiness", - "internationalBusiness:Accounting", - "internationalBusiness:AccountingAndAdvisoryServices", - "internationalBusiness:BrandManagement", - "internationalBusiness:BusinessAnalytics", - "internationalBusiness:CorporateInnovation", - "internationalBusiness:EntrepreneurialStartups", - "internationalBusiness:FamilyBusiness", - "internationalBusiness:Finance", - "internationalBusiness:Fintech", - "internationalBusiness:HealthcareManagementAndConsulting", - "internationalBusiness:Management", - "internationalBusiness:ManagementInformationSystems", - "internationalBusiness:Marketing", - "internationalBusiness:MarketingAnalytics", - "internationalBusiness:SocialInnovationAndEntrepreneurship", - "internationalBusiness:SupplyChainManagement", - "journalism", - "landscapeArchitecture", - "linguistics", - "marineBiology", - "mathematics", - "mechanicalEngineering", - "mediaAndScreenStudies", - "mediaArts", - "music", - "musicTechnology", - "nursing", - "pharmaceuticalSciences", - "pharmacy(PharmD)", - "philosophy", - "physics", - "politicalScience", - "politicsPhilosophyEconomics", - "psychology", - "publicHealth", - "publicRelations", - "religiousStudies", - "sociology", - "spanish", - "speechLanguagePathologyAndAudiology", - "theatre" - ], - "allOf": [ - { - "$ref": "#/definitions/models.Major" - } - ] - }, - "major2": { - "maxLength": 255, - "enum": [ - "africanaStudies", - "americanSignLanguage", - "americanSignLanguage-EnglishInterpreting", - "appliedPhysics", - "architecturalStudies", - "architecture", - "art:ArtVisualStudies", - "behavioralNeuroscience", - "biochemistry", - "bioengineering", - "biology", - "biomedicalPhysics", - "businessAdministration", - "businessAdministration:Accounting", - "businessAdministration:AccountingAndAdvisoryServices", - "businessAdministration:BrandManagement", - "businessAdministration:BusinessAnalytics", - "businessAdministration:CorporateInnovation", - "businessAdministration:EntrepreneurialStartups", - "businessAdministration:FamilyBusiness", - "businessAdministration:Finance", - "businessAdministration:Fintech", - "businessAdministration:HealthcareManagementAndConsulting", - "businessAdministration:Management", - "businessAdministration:ManagementInformationSystems", - "businessAdministration:Marketing", - "businessAdministration:MarketingAnalytics", - "businessAdministration:SocialInnovationAndEntrepreneurship", - "businessAdministration:SupplyChainManagement", - "cellAndMolecularBiology", - "chemicalEngineering", - "chemistry", - "civilEngineering", - "communicationStudies", - "computerEngineering", - "computerScience", - "computingAndLaw", - "criminologyAndCriminalJustice", - "culturalAnthropology", - "cybersecurity", - "dataScience", - "design", - "economics", - "electricalEngineering", - "english", - "environmentalAndSustainabilityStudies", - "environmentalEngineering", - "environmentalScience", - "environmentalStudies", - "gameArtAndAnimation", - "gameDesign", - "globalAsianStudies", - "healthScience", - "history", - "historyCultureAndLaw", - "humanServices", - "industrialEngineering", - "internationalAffairs", - "internationalBusiness", - "internationalBusiness:Accounting", - "internationalBusiness:AccountingAndAdvisoryServices", - "internationalBusiness:BrandManagement", - "internationalBusiness:BusinessAnalytics", - "internationalBusiness:CorporateInnovation", - "internationalBusiness:EntrepreneurialStartups", - "internationalBusiness:FamilyBusiness", - "internationalBusiness:Finance", - "internationalBusiness:Fintech", - "internationalBusiness:HealthcareManagementAndConsulting", - "internationalBusiness:Management", - "internationalBusiness:ManagementInformationSystems", - "internationalBusiness:Marketing", - "internationalBusiness:MarketingAnalytics", - "internationalBusiness:SocialInnovationAndEntrepreneurship", - "internationalBusiness:SupplyChainManagement", - "journalism", - "landscapeArchitecture", - "linguistics", - "marineBiology", - "mathematics", - "mechanicalEngineering", - "mediaAndScreenStudies", - "mediaArts", - "music", - "musicTechnology", - "nursing", - "pharmaceuticalSciences", - "pharmacy(PharmD)", - "philosophy", - "physics", - "politicalScience", - "politicsPhilosophyEconomics", - "psychology", - "publicHealth", - "publicRelations", - "religiousStudies", - "sociology", - "spanish", - "speechLanguagePathologyAndAudiology", - "theatre" - ], - "allOf": [ - { - "$ref": "#/definitions/models.Major" + "enum": [ + "unrestricted", + "tryout", + "application" + ], + "x-enum-varnames": [ + "Unrestricted", + "Tryout", + "Application" + ] + }, + "models.Tag": { + "type": "object", + "properties": { + "category_id": { + "type": "string" + }, + "created_at": { + "type": "string", + "example": "2023-09-20T16:34:50Z" + }, + "id": { + "type": "string", + "example": "123e4567-e89b-12d3-a456-426614174000" + }, + "name": { + "type": "string" + }, + "updated_at": { + "type": "string", + "example": "2023-09-20T16:34:50Z" + } + } + }, + "models.User": { + "type": "object", + "properties": { + "college": { + "$ref": "#/definitions/models.College" + }, + "created_at": { + "type": "string", + "example": "2023-09-20T16:34:50Z" + }, + "email": { + "type": "string" + }, + "first_name": { + "type": "string" + }, + "graduation_cycle": { + "$ref": "#/definitions/models.GraduationCycle" + }, + "graduation_year": { + "type": "integer" + }, + "id": { + "type": "string", + "example": "123e4567-e89b-12d3-a456-426614174000" + }, + "is_verified": { + "type": "boolean" + }, + "last_name": { + "type": "string" + }, + "major0": { + "$ref": "#/definitions/models.Major" + }, + "major1": { + "$ref": "#/definitions/models.Major" + }, + "major2": { + "$ref": "#/definitions/models.Major" + }, + "role": { + "type": "string" + }, + "updated_at": { + "type": "string", + "example": "2023-09-20T16:34:50Z" + } + } + }, + "tags.CreateClubTagsRequestBody": { + "type": "object", + "required": [ + "tags" + ], + "properties": { + "tags": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "tags.CreateUserTagsBody": { + "type": "object", + "required": [ + "tags" + ], + "properties": { + "tags": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "utilities.SuccessResponse": { + "type": "object", + "properties": { + "message": { + "type": "string" + } } - ] - }, - "role": { - "type": "string", - "enum": ["super", "student"] - }, - "updated_at": { - "type": "string", - "example": "2023-09-20T16:34:50Z" - } - } - }, - "models.VerifyEmailRequestBody": { - "type": "object", - "required": ["email", "token"], - "properties": { - "email": { - "type": "string" - }, - "token": { - "type": "string" - } - } - }, - "models.VerifyPasswordResetTokenRequestBody": { - "type": "object", - "required": ["new_password", "token", "verify_new_password"], - "properties": { - "new_password": { - "type": "string", - "minLength": 8 - }, - "token": { - "type": "string" - }, - "verify_new_password": { - "type": "string", - "minLength": 8 - } - } - }, - "tag.CreateUserTagsBody": { - "type": "object", - "required": ["tags"], - "properties": { - "tags": { - "type": "array", - "items": { - "type": "string" - } - } - } - }, - "utilities.SuccessResponse": { - "type": "object", - "properties": { - "message": { - "type": "string" } - } } - } -} +} \ No newline at end of file diff --git a/backend/docs/swagger.yaml b/backend/docs/swagger.yaml index ff6e151e5..93f68a29c 100644 --- a/backend/docs/swagger.yaml +++ b/backend/docs/swagger.yaml @@ -1,43 +1,38 @@ definitions: - models.Category: + auth.LoginResponseBody: properties: - created_at: - example: "2023-09-20T16:34:50Z" - type: string - id: - example: 123e4567-e89b-12d3-a456-426614174000 + email: type: string - name: + password: + description: 'MARK: must be validated manually' maxLength: 255 type: string - updated_at: - example: "2023-09-20T16:34:50Z" - type: string required: - - name + - email + - password type: object - categories.CategoryRequestBody: + auth.UpdatePasswordRequestBody: properties: - name: + new_password: + description: 'MARK: must be validated manually' + maxLength: 255 + type: string + old_password: + description: 'MARK: must be validated manually' maxLength: 255 type: string required: - - name + - new_password + - old_password type: object - models.Club: + base.CreateClubRequestBody: properties: application_link: maxLength: 255 type: string - created_at: - example: "2023-09-20T16:34:50Z" - type: string description: maxLength: 255 type: string - id: - example: 123e4567-e89b-12d3-a456-426614174000 - type: string is_recruiting: type: boolean logo: @@ -46,9 +41,6 @@ definitions: name: maxLength: 255 type: string - num_members: - minimum: 1 - type: integer one_word_to_describe_us: maxLength: 255 type: string @@ -57,300 +49,496 @@ definitions: type: string recruitment_cycle: allOf: - - $ref: "#/definitions/models.RecruitmentCycle" + - $ref: '#/definitions/models.RecruitmentCycle' enum: - - fall - - spring - - fallSpring - - always + - fall + - spring + - fallSpring + - always maxLength: 255 recruitment_type: allOf: - - $ref: "#/definitions/models.RecruitmentType" + - $ref: '#/definitions/models.RecruitmentType' enum: - - unrestricted - - tryout - - application + - unrestricted + - tryout + - application maxLength: 255 - updated_at: - example: "2023-09-20T16:34:50Z" + user_id: type: string weekly_time_commitment: minimum: 1 type: integer required: - - application_link - - description - - is_recruiting - - name - - num_members - - preview - - recruitment_cycle - - recruitment_type + - application_link + - description + - is_recruiting + - name + - preview + - recruitment_cycle + - recruitment_type + - user_id type: object - models.College: - enum: - - CAMD - - DMSB - - KCCS - - CE - - BCHS - - SL - - CPS - - CS - - CSSH - type: string - x-enum-comments: - BCHS: Bouvé College of Health Sciences - CAMD: College of Arts, Media and Design - CE: College of Engineering - CPS: College of Professional Studies - CS: College of Science - CSSH: College of Social Sciences and Humanities - DMSB: D'Amore-McKim School of Business - KCCS: Khoury College of Computer Sciences - SL: School of Law - x-enum-varnames: - - CAMD - - DMSB - - KCCS - - CE - - BCHS - - SL - - CPS - - CS - - CSSH - models.Contact: + base.CreateFileRequestBody: properties: - content: - maxLength: 255 - type: string - created_at: - example: "2023-09-20T16:34:50Z" - type: string - id: - example: 123e4567-e89b-12d3-a456-426614174000 + owner_id: type: string - type: - allOf: - - $ref: "#/definitions/models.ContactType" - enum: - - facebook - - instagram - - x - - linkedin - - youtube - - github - - slack - - discord - - email - - customSite + owner_type: maxLength: 255 - updated_at: - example: "2023-09-20T16:34:50Z" type: string required: - - content - - type + - owner_id + - owner_type type: object - models.ContactType: - enum: - - facebook - - instagram - - x - - linkedin - - youtube - - github - - slack - - discord - - email - - customSite - type: string - x-enum-varnames: - - Facebook - - Instagram - - X - - LinkedIn - - YouTube - - GitHub - - Slack - - Discord - - Email - - CustomSite - CreateClubRequestBody: + base.CreateTagRequestBody: properties: - application_link: - maxLength: 255 + category_id: type: string - description: + name: maxLength: 255 type: string - is_recruiting: - type: boolean - logo: + required: + - category_id + - name + type: object + base.CreateUserRequestBody: + properties: + college: + allOf: + - $ref: '#/definitions/models.College' + enum: + - CAMD + - DMSB + - KCCS + - CE + - BCHS + - SL + - CPS + - CS + - CSSH + email: maxLength: 255 type: string - name: + first_name: maxLength: 255 type: string - one_word_to_describe_us: + graduation_cycle: + allOf: + - $ref: '#/definitions/models.GraduationCycle' + enum: + - december + - may maxLength: 255 - type: string - preview: + graduation_year: + type: integer + last_name: maxLength: 255 type: string - recruitment_cycle: + major0: allOf: - - $ref: "#/definitions/models.RecruitmentCycle" + - $ref: '#/definitions/models.Major' + description: Optional fields enum: - - fall - - spring - - fallSpring - - always + - africanaStudies + - americanSignLanguage + - americanSignLanguage-EnglishInterpreting + - appliedPhysics + - architecturalStudies + - architecture + - art:ArtVisualStudies + - behavioralNeuroscience + - biochemistry + - bioengineering + - biology + - biomedicalPhysics + - businessAdministration + - businessAdministration:Accounting + - businessAdministration:AccountingAndAdvisoryServices + - businessAdministration:BrandManagement + - businessAdministration:BusinessAnalytics + - businessAdministration:CorporateInnovation + - businessAdministration:EntrepreneurialStartups + - businessAdministration:FamilyBusiness + - businessAdministration:Finance + - businessAdministration:Fintech + - businessAdministration:HealthcareManagementAndConsulting + - businessAdministration:Management + - businessAdministration:ManagementInformationSystems + - businessAdministration:Marketing + - businessAdministration:MarketingAnalytics + - businessAdministration:SocialInnovationAndEntrepreneurship + - businessAdministration:SupplyChainManagement + - cellAndMolecularBiology + - chemicalEngineering + - chemistry + - civilEngineering + - communicationStudies + - computerEngineering + - computerScience + - computingAndLaw + - criminologyAndCriminalJustice + - culturalAnthropology + - cybersecurity + - dataScience + - design + - economics + - electricalEngineering + - english + - environmentalAndSustainabilityStudies + - environmentalEngineering + - environmentalScience + - environmentalStudies + - gameArtAndAnimation + - gameDesign + - globalAsianStudies + - healthScience + - history + - historyCultureAndLaw + - humanServices + - industrialEngineering + - internationalAffairs + - internationalBusiness + - internationalBusiness:Accounting + - internationalBusiness:AccountingAndAdvisoryServices + - internationalBusiness:BrandManagement + - internationalBusiness:BusinessAnalytics + - internationalBusiness:CorporateInnovation + - internationalBusiness:EntrepreneurialStartups + - internationalBusiness:FamilyBusiness + - internationalBusiness:Finance + - internationalBusiness:Fintech + - internationalBusiness:HealthcareManagementAndConsulting + - internationalBusiness:Management + - internationalBusiness:ManagementInformationSystems + - internationalBusiness:Marketing + - internationalBusiness:MarketingAnalytics + - internationalBusiness:SocialInnovationAndEntrepreneurship + - internationalBusiness:SupplyChainManagement + - journalism + - landscapeArchitecture + - linguistics + - marineBiology + - mathematics + - mechanicalEngineering + - mediaAndScreenStudies + - mediaArts + - music + - musicTechnology + - nursing + - pharmaceuticalSciences + - pharmacy(PharmD) + - philosophy + - physics + - politicalScience + - politicsPhilosophyEconomics + - psychology + - publicHealth + - publicRelations + - religiousStudies + - sociology + - spanish + - speechLanguagePathologyAndAudiology + - theatre maxLength: 255 - recruitment_type: + major1: allOf: - - $ref: "#/definitions/models.RecruitmentType" + - $ref: '#/definitions/models.Major' enum: - - unrestricted - - tryout - - application + - africanaStudies + - americanSignLanguage + - americanSignLanguage-EnglishInterpreting + - appliedPhysics + - architecturalStudies + - architecture + - art:ArtVisualStudies + - behavioralNeuroscience + - biochemistry + - bioengineering + - biology + - biomedicalPhysics + - businessAdministration + - businessAdministration:Accounting + - businessAdministration:AccountingAndAdvisoryServices + - businessAdministration:BrandManagement + - businessAdministration:BusinessAnalytics + - businessAdministration:CorporateInnovation + - businessAdministration:EntrepreneurialStartups + - businessAdministration:FamilyBusiness + - businessAdministration:Finance + - businessAdministration:Fintech + - businessAdministration:HealthcareManagementAndConsulting + - businessAdministration:Management + - businessAdministration:ManagementInformationSystems + - businessAdministration:Marketing + - businessAdministration:MarketingAnalytics + - businessAdministration:SocialInnovationAndEntrepreneurship + - businessAdministration:SupplyChainManagement + - cellAndMolecularBiology + - chemicalEngineering + - chemistry + - civilEngineering + - communicationStudies + - computerEngineering + - computerScience + - computingAndLaw + - criminologyAndCriminalJustice + - culturalAnthropology + - cybersecurity + - dataScience + - design + - economics + - electricalEngineering + - english + - environmentalAndSustainabilityStudies + - environmentalEngineering + - environmentalScience + - environmentalStudies + - gameArtAndAnimation + - gameDesign + - globalAsianStudies + - healthScience + - history + - historyCultureAndLaw + - humanServices + - industrialEngineering + - internationalAffairs + - internationalBusiness + - internationalBusiness:Accounting + - internationalBusiness:AccountingAndAdvisoryServices + - internationalBusiness:BrandManagement + - internationalBusiness:BusinessAnalytics + - internationalBusiness:CorporateInnovation + - internationalBusiness:EntrepreneurialStartups + - internationalBusiness:FamilyBusiness + - internationalBusiness:Finance + - internationalBusiness:Fintech + - internationalBusiness:HealthcareManagementAndConsulting + - internationalBusiness:Management + - internationalBusiness:ManagementInformationSystems + - internationalBusiness:Marketing + - internationalBusiness:MarketingAnalytics + - internationalBusiness:SocialInnovationAndEntrepreneurship + - internationalBusiness:SupplyChainManagement + - journalism + - landscapeArchitecture + - linguistics + - marineBiology + - mathematics + - mechanicalEngineering + - mediaAndScreenStudies + - mediaArts + - music + - musicTechnology + - nursing + - pharmaceuticalSciences + - pharmacy(PharmD) + - philosophy + - physics + - politicalScience + - politicsPhilosophyEconomics + - psychology + - publicHealth + - publicRelations + - religiousStudies + - sociology + - spanish + - speechLanguagePathologyAndAudiology + - theatre + maxLength: 255 + major2: + allOf: + - $ref: '#/definitions/models.Major' + enum: + - africanaStudies + - americanSignLanguage + - americanSignLanguage-EnglishInterpreting + - appliedPhysics + - architecturalStudies + - architecture + - art:ArtVisualStudies + - behavioralNeuroscience + - biochemistry + - bioengineering + - biology + - biomedicalPhysics + - businessAdministration + - businessAdministration:Accounting + - businessAdministration:AccountingAndAdvisoryServices + - businessAdministration:BrandManagement + - businessAdministration:BusinessAnalytics + - businessAdministration:CorporateInnovation + - businessAdministration:EntrepreneurialStartups + - businessAdministration:FamilyBusiness + - businessAdministration:Finance + - businessAdministration:Fintech + - businessAdministration:HealthcareManagementAndConsulting + - businessAdministration:Management + - businessAdministration:ManagementInformationSystems + - businessAdministration:Marketing + - businessAdministration:MarketingAnalytics + - businessAdministration:SocialInnovationAndEntrepreneurship + - businessAdministration:SupplyChainManagement + - cellAndMolecularBiology + - chemicalEngineering + - chemistry + - civilEngineering + - communicationStudies + - computerEngineering + - computerScience + - computingAndLaw + - criminologyAndCriminalJustice + - culturalAnthropology + - cybersecurity + - dataScience + - design + - economics + - electricalEngineering + - english + - environmentalAndSustainabilityStudies + - environmentalEngineering + - environmentalScience + - environmentalStudies + - gameArtAndAnimation + - gameDesign + - globalAsianStudies + - healthScience + - history + - historyCultureAndLaw + - humanServices + - industrialEngineering + - internationalAffairs + - internationalBusiness + - internationalBusiness:Accounting + - internationalBusiness:AccountingAndAdvisoryServices + - internationalBusiness:BrandManagement + - internationalBusiness:BusinessAnalytics + - internationalBusiness:CorporateInnovation + - internationalBusiness:EntrepreneurialStartups + - internationalBusiness:FamilyBusiness + - internationalBusiness:Finance + - internationalBusiness:Fintech + - internationalBusiness:HealthcareManagementAndConsulting + - internationalBusiness:Management + - internationalBusiness:ManagementInformationSystems + - internationalBusiness:Marketing + - internationalBusiness:MarketingAnalytics + - internationalBusiness:SocialInnovationAndEntrepreneurship + - internationalBusiness:SupplyChainManagement + - journalism + - landscapeArchitecture + - linguistics + - marineBiology + - mathematics + - mechanicalEngineering + - mediaAndScreenStudies + - mediaArts + - music + - musicTechnology + - nursing + - pharmaceuticalSciences + - pharmacy(PharmD) + - philosophy + - physics + - politicalScience + - politicsPhilosophyEconomics + - psychology + - publicHealth + - publicRelations + - religiousStudies + - sociology + - spanish + - speechLanguagePathologyAndAudiology + - theatre + maxLength: 255 + password: + description: 'MARK: must be validated manually' maxLength: 255 - user_id: type: string - weekly_time_commitment: - minimum: 1 - type: integer - required: - - application_link - - description - - is_recruiting - - name - - preview - - recruitment_cycle - - recruitment_type - - user_id - type: object - CreateClubTagsRequestBody: - properties: - tags: - items: - type: string - type: array required: - - tags + - email + - first_name + - last_name + - password type: object - events.CreateEventRequestBody: + base.UpdateClubRequestBody: properties: - content: + application_link: maxLength: 255 type: string - end_time: - type: string - event_type: - allOf: - - $ref: "#/definitions/models.EventType" - enum: - - open - - membersOnly + description: maxLength: 255 - host: - description: TODO club/tag/notification logic type: string - is_recurring: + is_recruiting: type: boolean - location: + logo: maxLength: 255 type: string name: maxLength: 255 type: string + one_word_to_describe_us: + maxLength: 255 + type: string preview: maxLength: 255 type: string - series: + recruitment_cycle: allOf: - - $ref: "#/definitions/models.CreateSeriesRequestBody" - description: TODO validate if isRecurring, then series is required - start_time: - type: string - required: - - content - - end_time - - event_type - - host - - is_recurring - - location - - name - - preview - - start_time - type: object - CreateFileRequestBody: - properties: - owner_id: - type: string - owner_type: + - $ref: '#/definitions/models.RecruitmentCycle' + enum: + - fall + - spring + - fallSpring + - always maxLength: 255 - type: string - required: - - owner_id - - owner_type - type: object - models.CreateSeriesRequestBody: - properties: - max_occurrences: - minimum: 2 - type: integer - recurring_type: + recruitment_type: allOf: - - $ref: "#/definitions/models.RecurringType" + - $ref: '#/definitions/models.RecruitmentType' enum: - - daily - - weekly - - monthly + - unrestricted + - tryout + - application maxLength: 255 + weekly_time_commitment: + minimum: 1 + type: integer required: - - max_occurrences - - recurring_type + - application_link + - recruitment_cycle + - recruitment_type type: object - CreateTagRequestBody: + base.UpdateTagRequestBody: properties: category_id: type: string name: maxLength: 255 type: string - required: - - category_id - - name type: object - CreateUserRequestBody: + base.UpdateUserRequestBody: properties: college: allOf: - - $ref: "#/definitions/models.College" + - $ref: '#/definitions/models.College' enum: - - CAMD - - DMSB - - KCCS - - CE - - BCHS - - SL - - CPS - - CS - - CSSH - email: - maxLength: 255 - type: string + - CAMD + - DMSB + - KCCS + - CE + - BCHS + - SL + - CPS + - CS + - CSSH first_name: maxLength: 255 type: string graduation_cycle: allOf: - - $ref: "#/definitions/models.GraduationCycle" + - $ref: '#/definitions/models.GraduationCycle' enum: - - december - - may + - december + - may maxLength: 255 graduation_year: type: integer @@ -359,1251 +547,853 @@ definitions: type: string major0: allOf: - - $ref: "#/definitions/models.Major" - description: Optional fields + - $ref: '#/definitions/models.Major' enum: - - africanaStudies - - americanSignLanguage - - americanSignLanguage-EnglishInterpreting - - appliedPhysics - - architecturalStudies - - architecture - - art:ArtVisualStudies - - behavioralNeuroscience - - biochemistry - - bioengineering - - biology - - biomedicalPhysics - - businessAdministration - - businessAdministration:Accounting - - businessAdministration:AccountingAndAdvisoryServices - - businessAdministration:BrandManagement - - businessAdministration:BusinessAnalytics - - businessAdministration:CorporateInnovation - - businessAdministration:EntrepreneurialStartups - - businessAdministration:FamilyBusiness - - businessAdministration:Finance - - businessAdministration:Fintech - - businessAdministration:HealthcareManagementAndConsulting - - businessAdministration:Management - - businessAdministration:ManagementInformationSystems - - businessAdministration:Marketing - - businessAdministration:MarketingAnalytics - - businessAdministration:SocialInnovationAndEntrepreneurship - - businessAdministration:SupplyChainManagement - - cellAndMolecularBiology - - chemicalEngineering - - chemistry - - civilEngineering - - communicationStudies - - computerEngineering - - computerScience - - computingAndLaw - - criminologyAndCriminalJustice - - culturalAnthropology - - cybersecurity - - dataScience - - design - - economics - - electricalEngineering - - english - - environmentalAndSustainabilityStudies - - environmentalEngineering - - environmentalScience - - environmentalStudies - - gameArtAndAnimation - - gameDesign - - globalAsianStudies - - healthScience - - history - - historyCultureAndLaw - - humanServices - - industrialEngineering - - internationalAffairs - - internationalBusiness - - internationalBusiness:Accounting - - internationalBusiness:AccountingAndAdvisoryServices - - internationalBusiness:BrandManagement - - internationalBusiness:BusinessAnalytics - - internationalBusiness:CorporateInnovation - - internationalBusiness:EntrepreneurialStartups - - internationalBusiness:FamilyBusiness - - internationalBusiness:Finance - - internationalBusiness:Fintech - - internationalBusiness:HealthcareManagementAndConsulting - - internationalBusiness:Management - - internationalBusiness:ManagementInformationSystems - - internationalBusiness:Marketing - - internationalBusiness:MarketingAnalytics - - internationalBusiness:SocialInnovationAndEntrepreneurship - - internationalBusiness:SupplyChainManagement - - journalism - - landscapeArchitecture - - linguistics - - marineBiology - - mathematics - - mechanicalEngineering - - mediaAndScreenStudies - - mediaArts - - music - - musicTechnology - - nursing - - pharmaceuticalSciences - - pharmacy(PharmD) - - philosophy - - physics - - politicalScience - - politicsPhilosophyEconomics - - psychology - - publicHealth - - publicRelations - - religiousStudies - - sociology - - spanish - - speechLanguagePathologyAndAudiology - - theatre + - africanaStudies + - americanSignLanguage + - americanSignLanguage-EnglishInterpreting + - appliedPhysics + - architecturalStudies + - architecture + - art:ArtVisualStudies + - behavioralNeuroscience + - biochemistry + - bioengineering + - biology + - biomedicalPhysics + - businessAdministration + - businessAdministration:Accounting + - businessAdministration:AccountingAndAdvisoryServices + - businessAdministration:BrandManagement + - businessAdministration:BusinessAnalytics + - businessAdministration:CorporateInnovation + - businessAdministration:EntrepreneurialStartups + - businessAdministration:FamilyBusiness + - businessAdministration:Finance + - businessAdministration:Fintech + - businessAdministration:HealthcareManagementAndConsulting + - businessAdministration:Management + - businessAdministration:ManagementInformationSystems + - businessAdministration:Marketing + - businessAdministration:MarketingAnalytics + - businessAdministration:SocialInnovationAndEntrepreneurship + - businessAdministration:SupplyChainManagement + - cellAndMolecularBiology + - chemicalEngineering + - chemistry + - civilEngineering + - communicationStudies + - computerEngineering + - computerScience + - computingAndLaw + - criminologyAndCriminalJustice + - culturalAnthropology + - cybersecurity + - dataScience + - design + - economics + - electricalEngineering + - english + - environmentalAndSustainabilityStudies + - environmentalEngineering + - environmentalScience + - environmentalStudies + - gameArtAndAnimation + - gameDesign + - globalAsianStudies + - healthScience + - history + - historyCultureAndLaw + - humanServices + - industrialEngineering + - internationalAffairs + - internationalBusiness + - internationalBusiness:Accounting + - internationalBusiness:AccountingAndAdvisoryServices + - internationalBusiness:BrandManagement + - internationalBusiness:BusinessAnalytics + - internationalBusiness:CorporateInnovation + - internationalBusiness:EntrepreneurialStartups + - internationalBusiness:FamilyBusiness + - internationalBusiness:Finance + - internationalBusiness:Fintech + - internationalBusiness:HealthcareManagementAndConsulting + - internationalBusiness:Management + - internationalBusiness:ManagementInformationSystems + - internationalBusiness:Marketing + - internationalBusiness:MarketingAnalytics + - internationalBusiness:SocialInnovationAndEntrepreneurship + - internationalBusiness:SupplyChainManagement + - journalism + - landscapeArchitecture + - linguistics + - marineBiology + - mathematics + - mechanicalEngineering + - mediaAndScreenStudies + - mediaArts + - music + - musicTechnology + - nursing + - pharmaceuticalSciences + - pharmacy(PharmD) + - philosophy + - physics + - politicalScience + - politicsPhilosophyEconomics + - psychology + - publicHealth + - publicRelations + - religiousStudies + - sociology + - spanish + - speechLanguagePathologyAndAudiology + - theatre maxLength: 255 major1: allOf: - - $ref: "#/definitions/models.Major" + - $ref: '#/definitions/models.Major' enum: - - africanaStudies - - americanSignLanguage - - americanSignLanguage-EnglishInterpreting - - appliedPhysics - - architecturalStudies - - architecture - - art:ArtVisualStudies - - behavioralNeuroscience - - biochemistry - - bioengineering - - biology - - biomedicalPhysics - - businessAdministration - - businessAdministration:Accounting - - businessAdministration:AccountingAndAdvisoryServices - - businessAdministration:BrandManagement - - businessAdministration:BusinessAnalytics - - businessAdministration:CorporateInnovation - - businessAdministration:EntrepreneurialStartups - - businessAdministration:FamilyBusiness - - businessAdministration:Finance - - businessAdministration:Fintech - - businessAdministration:HealthcareManagementAndConsulting - - businessAdministration:Management - - businessAdministration:ManagementInformationSystems - - businessAdministration:Marketing - - businessAdministration:MarketingAnalytics - - businessAdministration:SocialInnovationAndEntrepreneurship - - businessAdministration:SupplyChainManagement - - cellAndMolecularBiology - - chemicalEngineering - - chemistry - - civilEngineering - - communicationStudies - - computerEngineering - - computerScience - - computingAndLaw - - criminologyAndCriminalJustice - - culturalAnthropology - - cybersecurity - - dataScience - - design - - economics - - electricalEngineering - - english - - environmentalAndSustainabilityStudies - - environmentalEngineering - - environmentalScience - - environmentalStudies - - gameArtAndAnimation - - gameDesign - - globalAsianStudies - - healthScience - - history - - historyCultureAndLaw - - humanServices - - industrialEngineering - - internationalAffairs - - internationalBusiness - - internationalBusiness:Accounting - - internationalBusiness:AccountingAndAdvisoryServices - - internationalBusiness:BrandManagement - - internationalBusiness:BusinessAnalytics - - internationalBusiness:CorporateInnovation - - internationalBusiness:EntrepreneurialStartups - - internationalBusiness:FamilyBusiness - - internationalBusiness:Finance - - internationalBusiness:Fintech - - internationalBusiness:HealthcareManagementAndConsulting - - internationalBusiness:Management - - internationalBusiness:ManagementInformationSystems - - internationalBusiness:Marketing - - internationalBusiness:MarketingAnalytics - - internationalBusiness:SocialInnovationAndEntrepreneurship - - internationalBusiness:SupplyChainManagement - - journalism - - landscapeArchitecture - - linguistics - - marineBiology - - mathematics - - mechanicalEngineering - - mediaAndScreenStudies - - mediaArts - - music - - musicTechnology - - nursing - - pharmaceuticalSciences - - pharmacy(PharmD) - - philosophy - - physics - - politicalScience - - politicsPhilosophyEconomics - - psychology - - publicHealth - - publicRelations - - religiousStudies - - sociology - - spanish - - speechLanguagePathologyAndAudiology - - theatre + - africanaStudies + - americanSignLanguage + - americanSignLanguage-EnglishInterpreting + - appliedPhysics + - architecturalStudies + - architecture + - art:ArtVisualStudies + - behavioralNeuroscience + - biochemistry + - bioengineering + - biology + - biomedicalPhysics + - businessAdministration + - businessAdministration:Accounting + - businessAdministration:AccountingAndAdvisoryServices + - businessAdministration:BrandManagement + - businessAdministration:BusinessAnalytics + - businessAdministration:CorporateInnovation + - businessAdministration:EntrepreneurialStartups + - businessAdministration:FamilyBusiness + - businessAdministration:Finance + - businessAdministration:Fintech + - businessAdministration:HealthcareManagementAndConsulting + - businessAdministration:Management + - businessAdministration:ManagementInformationSystems + - businessAdministration:Marketing + - businessAdministration:MarketingAnalytics + - businessAdministration:SocialInnovationAndEntrepreneurship + - businessAdministration:SupplyChainManagement + - cellAndMolecularBiology + - chemicalEngineering + - chemistry + - civilEngineering + - communicationStudies + - computerEngineering + - computerScience + - computingAndLaw + - criminologyAndCriminalJustice + - culturalAnthropology + - cybersecurity + - dataScience + - design + - economics + - electricalEngineering + - english + - environmentalAndSustainabilityStudies + - environmentalEngineering + - environmentalScience + - environmentalStudies + - gameArtAndAnimation + - gameDesign + - globalAsianStudies + - healthScience + - history + - historyCultureAndLaw + - humanServices + - industrialEngineering + - internationalAffairs + - internationalBusiness + - internationalBusiness:Accounting + - internationalBusiness:AccountingAndAdvisoryServices + - internationalBusiness:BrandManagement + - internationalBusiness:BusinessAnalytics + - internationalBusiness:CorporateInnovation + - internationalBusiness:EntrepreneurialStartups + - internationalBusiness:FamilyBusiness + - internationalBusiness:Finance + - internationalBusiness:Fintech + - internationalBusiness:HealthcareManagementAndConsulting + - internationalBusiness:Management + - internationalBusiness:ManagementInformationSystems + - internationalBusiness:Marketing + - internationalBusiness:MarketingAnalytics + - internationalBusiness:SocialInnovationAndEntrepreneurship + - internationalBusiness:SupplyChainManagement + - journalism + - landscapeArchitecture + - linguistics + - marineBiology + - mathematics + - mechanicalEngineering + - mediaAndScreenStudies + - mediaArts + - music + - musicTechnology + - nursing + - pharmaceuticalSciences + - pharmacy(PharmD) + - philosophy + - physics + - politicalScience + - politicsPhilosophyEconomics + - psychology + - publicHealth + - publicRelations + - religiousStudies + - sociology + - spanish + - speechLanguagePathologyAndAudiology + - theatre maxLength: 255 major2: allOf: - - $ref: "#/definitions/models.Major" + - $ref: '#/definitions/models.Major' enum: - - africanaStudies - - americanSignLanguage - - americanSignLanguage-EnglishInterpreting - - appliedPhysics - - architecturalStudies - - architecture - - art:ArtVisualStudies - - behavioralNeuroscience - - biochemistry - - bioengineering - - biology - - biomedicalPhysics - - businessAdministration - - businessAdministration:Accounting - - businessAdministration:AccountingAndAdvisoryServices - - businessAdministration:BrandManagement - - businessAdministration:BusinessAnalytics - - businessAdministration:CorporateInnovation - - businessAdministration:EntrepreneurialStartups - - businessAdministration:FamilyBusiness - - businessAdministration:Finance - - businessAdministration:Fintech - - businessAdministration:HealthcareManagementAndConsulting - - businessAdministration:Management - - businessAdministration:ManagementInformationSystems - - businessAdministration:Marketing - - businessAdministration:MarketingAnalytics - - businessAdministration:SocialInnovationAndEntrepreneurship - - businessAdministration:SupplyChainManagement - - cellAndMolecularBiology - - chemicalEngineering - - chemistry - - civilEngineering - - communicationStudies - - computerEngineering - - computerScience - - computingAndLaw - - criminologyAndCriminalJustice - - culturalAnthropology - - cybersecurity - - dataScience - - design - - economics - - electricalEngineering - - english - - environmentalAndSustainabilityStudies - - environmentalEngineering - - environmentalScience - - environmentalStudies - - gameArtAndAnimation - - gameDesign - - globalAsianStudies - - healthScience - - history - - historyCultureAndLaw - - humanServices - - industrialEngineering - - internationalAffairs - - internationalBusiness - - internationalBusiness:Accounting - - internationalBusiness:AccountingAndAdvisoryServices - - internationalBusiness:BrandManagement - - internationalBusiness:BusinessAnalytics - - internationalBusiness:CorporateInnovation - - internationalBusiness:EntrepreneurialStartups - - internationalBusiness:FamilyBusiness - - internationalBusiness:Finance - - internationalBusiness:Fintech - - internationalBusiness:HealthcareManagementAndConsulting - - internationalBusiness:Management - - internationalBusiness:ManagementInformationSystems - - internationalBusiness:Marketing - - internationalBusiness:MarketingAnalytics - - internationalBusiness:SocialInnovationAndEntrepreneurship - - internationalBusiness:SupplyChainManagement - - journalism - - landscapeArchitecture - - linguistics - - marineBiology - - mathematics - - mechanicalEngineering - - mediaAndScreenStudies - - mediaArts - - music - - musicTechnology - - nursing - - pharmaceuticalSciences - - pharmacy(PharmD) - - philosophy - - physics - - politicalScience - - politicsPhilosophyEconomics - - psychology - - publicHealth - - publicRelations - - religiousStudies - - sociology - - spanish - - speechLanguagePathologyAndAudiology - - theatre + - africanaStudies + - americanSignLanguage + - americanSignLanguage-EnglishInterpreting + - appliedPhysics + - architecturalStudies + - architecture + - art:ArtVisualStudies + - behavioralNeuroscience + - biochemistry + - bioengineering + - biology + - biomedicalPhysics + - businessAdministration + - businessAdministration:Accounting + - businessAdministration:AccountingAndAdvisoryServices + - businessAdministration:BrandManagement + - businessAdministration:BusinessAnalytics + - businessAdministration:CorporateInnovation + - businessAdministration:EntrepreneurialStartups + - businessAdministration:FamilyBusiness + - businessAdministration:Finance + - businessAdministration:Fintech + - businessAdministration:HealthcareManagementAndConsulting + - businessAdministration:Management + - businessAdministration:ManagementInformationSystems + - businessAdministration:Marketing + - businessAdministration:MarketingAnalytics + - businessAdministration:SocialInnovationAndEntrepreneurship + - businessAdministration:SupplyChainManagement + - cellAndMolecularBiology + - chemicalEngineering + - chemistry + - civilEngineering + - communicationStudies + - computerEngineering + - computerScience + - computingAndLaw + - criminologyAndCriminalJustice + - culturalAnthropology + - cybersecurity + - dataScience + - design + - economics + - electricalEngineering + - english + - environmentalAndSustainabilityStudies + - environmentalEngineering + - environmentalScience + - environmentalStudies + - gameArtAndAnimation + - gameDesign + - globalAsianStudies + - healthScience + - history + - historyCultureAndLaw + - humanServices + - industrialEngineering + - internationalAffairs + - internationalBusiness + - internationalBusiness:Accounting + - internationalBusiness:AccountingAndAdvisoryServices + - internationalBusiness:BrandManagement + - internationalBusiness:BusinessAnalytics + - internationalBusiness:CorporateInnovation + - internationalBusiness:EntrepreneurialStartups + - internationalBusiness:FamilyBusiness + - internationalBusiness:Finance + - internationalBusiness:Fintech + - internationalBusiness:HealthcareManagementAndConsulting + - internationalBusiness:Management + - internationalBusiness:ManagementInformationSystems + - internationalBusiness:Marketing + - internationalBusiness:MarketingAnalytics + - internationalBusiness:SocialInnovationAndEntrepreneurship + - internationalBusiness:SupplyChainManagement + - journalism + - landscapeArchitecture + - linguistics + - marineBiology + - mathematics + - mechanicalEngineering + - mediaAndScreenStudies + - mediaArts + - music + - musicTechnology + - nursing + - pharmaceuticalSciences + - pharmacy(PharmD) + - philosophy + - physics + - politicalScience + - politicsPhilosophyEconomics + - psychology + - publicHealth + - publicRelations + - religiousStudies + - sociology + - spanish + - speechLanguagePathologyAndAudiology + - theatre maxLength: 255 - password: - description: "MARK: must be validated manually" + type: object + base.VerifyEmailRequestBody: + properties: + email: + type: string + token: + type: string + required: + - email + - token + type: object + base.VerifyPasswordResetTokenRequestBody: + properties: + new_password: + minLength: 8 + type: string + token: + type: string + verify_new_password: + minLength: 8 + type: string + required: + - new_password + - token + - verify_new_password + type: object + categories.CategoryRequestBody: + properties: + name: maxLength: 255 type: string required: - - email - - first_name - - last_name - - password + - name type: object - models.Event: + contacts.PutContactRequestBody: properties: content: maxLength: 255 type: string - created_at: - example: "2023-09-20T16:34:50Z" - type: string - end_time: - type: string - event_type: + type: allOf: - - $ref: "#/definitions/models.EventType" + - $ref: '#/definitions/models.ContactType' enum: - - open - - membersOnly + - facebook + - instagram + - x + - linkedin + - youtube + - github + - slack + - discord + - email + - customSite maxLength: 255 - host: + required: + - content + - type + type: object + models.Category: + properties: + created_at: + example: "2023-09-20T16:34:50Z" type: string id: example: 123e4567-e89b-12d3-a456-426614174000 type: string - is_recurring: - type: boolean - location: - maxLength: 255 - type: string - meeting_link: - type: string name: - maxLength: 255 - type: string - preview: - maxLength: 255 - type: string - start_time: type: string updated_at: example: "2023-09-20T16:34:50Z" type: string - required: - - content - - end_time - - event_type - - location - - name - - preview - - start_time type: object - models.EventType: - enum: - - open - - membersOnly - type: string - x-enum-varnames: - - Open - - MembersOnly - models.File: + models.Club: properties: + application_link: + type: string created_at: example: "2023-09-20T16:34:50Z" type: string - file_name: - maxLength: 255 - type: string - file_size: - minimum: 1 - type: integer - file_type: - maxLength: 255 - type: string - file_url: - maxLength: 255 + description: type: string id: example: 123e4567-e89b-12d3-a456-426614174000 type: string - object_key: - maxLength: 255 + is_recruiting: + type: boolean + logo: + type: string + name: + type: string + num_members: + type: integer + one_word_to_describe_us: + type: string + preview: type: string + recruitment_cycle: + $ref: '#/definitions/models.RecruitmentCycle' + recruitment_type: + $ref: '#/definitions/models.RecruitmentType' updated_at: example: "2023-09-20T16:34:50Z" type: string - required: - - file_name - - file_size - - file_type - - file_url - - object_key + weekly_time_commitment: + type: integer type: object - models.GraduationCycle: + models.College: enum: - - december - - may + - CAMD + - DMSB + - KCCS + - CE + - BCHS + - SL + - CPS + - CS + - CSSH type: string + x-enum-comments: + BCHS: Bouvé College of Health Sciences + CAMD: College of Arts, Media and Design + CE: College of Engineering + CPS: College of Professional Studies + CS: College of Science + CSSH: College of Social Sciences and Humanities + DMSB: D'Amore-McKim School of Business + KCCS: Khoury College of Computer Sciences + SL: School of Law x-enum-varnames: - - December - - May - models.LoginResponseBody: + - CAMD + - DMSB + - KCCS + - CE + - BCHS + - SL + - CPS + - CS + - CSSH + models.Contact: properties: - email: + content: type: string - password: - description: "MARK: must be validated manually" - maxLength: 255 + created_at: + example: "2023-09-20T16:34:50Z" + type: string + id: + example: 123e4567-e89b-12d3-a456-426614174000 + type: string + type: + $ref: '#/definitions/models.ContactType' + updated_at: + example: "2023-09-20T16:34:50Z" type: string - required: - - email - - password type: object - models.Major: + models.ContactType: enum: - - africanaStudies - - americanSignLanguage - - americanSignLanguage-EnglishInterpreting - - appliedPhysics - - architecturalStudies - - architecture - - art:ArtVisualStudies - - behavioralNeuroscience - - biochemistry - - bioengineering - - biology - - biomedicalPhysics - - businessAdministration - - businessAdministration:Accounting - - businessAdministration:AccountingAndAdvisoryServices - - businessAdministration:BrandManagement - - businessAdministration:BusinessAnalytics - - businessAdministration:CorporateInnovation - - businessAdministration:EntrepreneurialStartups - - businessAdministration:FamilyBusiness - - businessAdministration:Finance - - businessAdministration:Fintech - - businessAdministration:HealthcareManagementAndConsulting - - businessAdministration:Management - - businessAdministration:ManagementInformationSystems - - businessAdministration:Marketing - - businessAdministration:MarketingAnalytics - - businessAdministration:SocialInnovationAndEntrepreneurship - - businessAdministration:SupplyChainManagement - - cellAndMolecularBiology - - chemicalEngineering - - chemistry - - civilEngineering - - communicationStudies - - computerEngineering - - computerScience - - computingAndLaw - - criminologyAndCriminalJustice - - culturalAnthropology - - cybersecurity - - dataScience - - design - - economics - - electricalEngineering - - english - - environmentalAndSustainabilityStudies - - environmentalEngineering - - environmentalScience - - environmentalStudies - - gameArtAndAnimation - - gameDesign - - globalAsianStudies - - healthScience - - history - - historyCultureAndLaw - - humanServices - - industrialEngineering - - internationalAffairs - - internationalBusiness - - internationalBusiness:Accounting - - internationalBusiness:AccountingAndAdvisoryServices - - internationalBusiness:BrandManagement - - internationalBusiness:BusinessAnalytics - - internationalBusiness:CorporateInnovation - - internationalBusiness:EntrepreneurialStartups - - internationalBusiness:FamilyBusiness - - internationalBusiness:Finance - - internationalBusiness:Fintech - - internationalBusiness:HealthcareManagementAndConsulting - - internationalBusiness:Management - - internationalBusiness:ManagementInformationSystems - - internationalBusiness:Marketing - - internationalBusiness:MarketingAnalytics - - internationalBusiness:SocialInnovationAndEntrepreneurship - - internationalBusiness:SupplyChainManagement - - journalism - - landscapeArchitecture - - linguistics - - marineBiology - - mathematics - - mechanicalEngineering - - mediaAndScreenStudies - - mediaArts - - music - - musicTechnology - - nursing - - pharmaceuticalSciences - - pharmacy(PharmD) - - philosophy - - physics - - politicalScience - - politicsPhilosophyEconomics - - psychology - - publicHealth - - publicRelations - - religiousStudies - - sociology - - spanish - - speechLanguagePathologyAndAudiology - - theatre + - facebook + - instagram + - x + - linkedin + - youtube + - github + - slack + - discord + - email + - customSite type: string x-enum-varnames: - - AfricanaStudies - - AmericanSignLanguage - - AmericanSignLanguageEnglishInterpreting - - AppliedPhysics - - ArchitecturalStudies - - Architecture - - ArtArtVisualStudies - - BehavioralNeuroscience - - Biochemistry - - Bioengineering - - Biology - - BiomedicalPhysics - - BusinessAdministration - - BusinessAdministrationAccounting - - BusinessAdministrationAccountingAndAdvisoryServices - - BusinessAdministrationBrandManagement - - BusinessAdministrationBusinessAnalytics - - BusinessAdministrationCorporateInnovation - - BusinessAdministrationEntrepreneurialStartups - - BusinessAdministrationFamilyBusiness - - BusinessAdministrationFinance - - BusinessAdministrationFintech - - BusinessAdministrationHealthcareManagementAndConsulting - - BusinessAdministrationManagement - - BusinessAdministrationManagementInformationSystems - - BusinessAdministrationMarketing - - BusinessAdministrationMarketingAnalytics - - BusinessAdministrationSocialInnovationAndEntrepreneurship - - BusinessAdministrationSupplyChainManagement - - CellAndMolecularBiology - - ChemicalEngineering - - Chemistry - - CivilEngineering - - CommunicationStudies - - ComputerEngineering - - ComputerScience - - ComputingAndLaw - - CriminologyAndCriminalJustice - - CulturalAnthropology - - Cybersecurity - - DataScience - - Design - - Economics - - ElectricalEngineering - - English - - EnvironmentalAndSustainabilityStudies - - EnvironmentalEngineering - - EnvironmentalScience - - EnvironmentalStudies - - GameArtAndAnimation - - GameDesign - - GlobalAsianStudies - - HealthScience - - History - - HistoryCultureAndLaw - - HumanServices - - IndustrialEngineering - - InternationalAffairs - - InternationalBusiness - - InternationalBusinessAccounting - - InternationalBusinessAccountingAndAdvisoryServices - - InternationalBusinessBrandManagement - - InternationalBusinessBusinessAnalytics - - InternationalBusinessCorporateInnovation - - InternationalBusinessEntrepreneurialStartups - - InternationalBusinessFamilyBusiness - - InternationalBusinessFinance - - InternationalBusinessFintech - - InternationalBusinessHealthcareManagementAndConsulting - - InternationalBusinessManagement - - InternationalBusinessManagementInformationSystems - - InternationalBusinessMarketing - - InternationalBusinessMarketingAnalytics - - InternationalBusinessSocialInnovationAndEntrepreneurship - - InternationalBusinessSupplyChainManagement - - Journalism - - LandscapeArchitecture - - Linguistics - - MarineBiology - - Mathematics - - MechanicalEngineering - - MediaAndScreenStudies - - MediaArts - - Music - - MusicTechnology - - Nursing - - PharmaceuticalSciences - - PharmacyPharmD - - Philosophy - - Physics - - PoliticalScience - - PoliticsPhilosophyEconomics - - Psychology - - PublicHealth - - PublicRelations - - ReligiousStudies - - Sociology - - Spanish - - SpeechLanguagePathologyAndAudiology - - Theatre - models.PointOfContact: + - Facebook + - Instagram + - X + - LinkedIn + - YouTube + - GitHub + - Slack + - Discord + - Email + - CustomSite + models.Event: properties: created_at: example: "2023-09-20T16:34:50Z" type: string - email: - maxLength: 255 + description: + type: string + end_time: + type: string + event_type: + allOf: + - $ref: '#/definitions/models.EventType' + description: geoshi + host: type: string id: example: 123e4567-e89b-12d3-a456-426614174000 type: string + is_archived: + type: boolean + is_draft: + type: boolean + is_public: + description: internal housekeeping states + type: boolean + link: + type: string + location: + type: string name: - maxLength: 255 + description: details type: string - photo_file: - $ref: "#/definitions/models.File" - position: - maxLength: 255 + preview: + type: string + start_time: + description: timing type: string updated_at: example: "2023-09-20T16:34:50Z" type: string - required: - - email - - name - - position - type: object - PutContactRequestBody: - properties: - content: - maxLength: 255 - type: string - type: - allOf: - - $ref: "#/definitions/models.ContactType" - enum: - - facebook - - instagram - - x - - linkedin - - youtube - - github - - slack - - discord - - email - - customSite - maxLength: 255 - required: - - content - - type type: object - models.RecruitmentCycle: - enum: - - fall - - spring - - fallSpring - - always - type: string - x-enum-varnames: - - Fall - - Spring - - FallSpring - - Always - models.RecruitmentType: - enum: - - unrestricted - - tryout - - application - type: string - x-enum-varnames: - - Unrestricted - - Tryout - - Application - models.RecurringType: + models.EventType: enum: - - daily - - weekly - - monthly + - hybrid + - in_person + - virtual type: string x-enum-varnames: - - Daily - - Weekly - - Monthly - models.Series: + - Hybrid + - InPerson + - Virtual + models.File: properties: created_at: example: "2023-09-20T16:34:50Z" type: string - events: - items: - $ref: "#/definitions/models.Event" - type: array - id: - example: 123e4567-e89b-12d3-a456-426614174000 + file_name: type: string - max_occurrences: - minimum: 1 + file_size: type: integer - recurring_type: - allOf: - - $ref: "#/definitions/models.RecurringType" - maxLength: 255 - updated_at: - example: "2023-09-20T16:34:50Z" - type: string - type: object - models.Tag: - properties: - category_id: + file_type: type: string - created_at: - example: "2023-09-20T16:34:50Z" + file_url: type: string id: example: 123e4567-e89b-12d3-a456-426614174000 type: string - name: - maxLength: 255 + object_key: type: string updated_at: example: "2023-09-20T16:34:50Z" type: string - required: - - category_id - - name - type: object - UpdateClubRequestBody: - properties: - application_link: - maxLength: 255 - type: string - description: - maxLength: 255 - type: string - is_recruiting: - type: boolean - logo: - maxLength: 255 - type: string - name: - maxLength: 255 - type: string - one_word_to_describe_us: - maxLength: 255 - type: string - preview: - maxLength: 255 - type: string - recruitment_cycle: - allOf: - - $ref: "#/definitions/models.RecruitmentCycle" - enum: - - fall - - spring - - fallSpring - - always - maxLength: 255 - recruitment_type: - allOf: - - $ref: "#/definitions/models.RecruitmentType" - enum: - - unrestricted - - tryout - - application - maxLength: 255 - weekly_time_commitment: - minimum: 1 - type: integer - required: - - application_link - - recruitment_cycle - - recruitment_type type: object - events.UpdateEventRequestBody: + models.GraduationCycle: + enum: + - december + - may + type: string + x-enum-varnames: + - December + - May + models.Major: + enum: + - africanaStudies + - americanSignLanguage + - americanSignLanguage-EnglishInterpreting + - appliedPhysics + - architecturalStudies + - architecture + - art:ArtVisualStudies + - behavioralNeuroscience + - biochemistry + - bioengineering + - biology + - biomedicalPhysics + - businessAdministration + - businessAdministration:Accounting + - businessAdministration:AccountingAndAdvisoryServices + - businessAdministration:BrandManagement + - businessAdministration:BusinessAnalytics + - businessAdministration:CorporateInnovation + - businessAdministration:EntrepreneurialStartups + - businessAdministration:FamilyBusiness + - businessAdministration:Finance + - businessAdministration:Fintech + - businessAdministration:HealthcareManagementAndConsulting + - businessAdministration:Management + - businessAdministration:ManagementInformationSystems + - businessAdministration:Marketing + - businessAdministration:MarketingAnalytics + - businessAdministration:SocialInnovationAndEntrepreneurship + - businessAdministration:SupplyChainManagement + - cellAndMolecularBiology + - chemicalEngineering + - chemistry + - civilEngineering + - communicationStudies + - computerEngineering + - computerScience + - computingAndLaw + - criminologyAndCriminalJustice + - culturalAnthropology + - cybersecurity + - dataScience + - design + - economics + - electricalEngineering + - english + - environmentalAndSustainabilityStudies + - environmentalEngineering + - environmentalScience + - environmentalStudies + - gameArtAndAnimation + - gameDesign + - globalAsianStudies + - healthScience + - history + - historyCultureAndLaw + - humanServices + - industrialEngineering + - internationalAffairs + - internationalBusiness + - internationalBusiness:Accounting + - internationalBusiness:AccountingAndAdvisoryServices + - internationalBusiness:BrandManagement + - internationalBusiness:BusinessAnalytics + - internationalBusiness:CorporateInnovation + - internationalBusiness:EntrepreneurialStartups + - internationalBusiness:FamilyBusiness + - internationalBusiness:Finance + - internationalBusiness:Fintech + - internationalBusiness:HealthcareManagementAndConsulting + - internationalBusiness:Management + - internationalBusiness:ManagementInformationSystems + - internationalBusiness:Marketing + - internationalBusiness:MarketingAnalytics + - internationalBusiness:SocialInnovationAndEntrepreneurship + - internationalBusiness:SupplyChainManagement + - journalism + - landscapeArchitecture + - linguistics + - marineBiology + - mathematics + - mechanicalEngineering + - mediaAndScreenStudies + - mediaArts + - music + - musicTechnology + - nursing + - pharmaceuticalSciences + - pharmacy(PharmD) + - philosophy + - physics + - politicalScience + - politicsPhilosophyEconomics + - psychology + - publicHealth + - publicRelations + - religiousStudies + - sociology + - spanish + - speechLanguagePathologyAndAudiology + - theatre + type: string + x-enum-varnames: + - AfricanaStudies + - AmericanSignLanguage + - AmericanSignLanguageEnglishInterpreting + - AppliedPhysics + - ArchitecturalStudies + - Architecture + - ArtArtVisualStudies + - BehavioralNeuroscience + - Biochemistry + - Bioengineering + - Biology + - BiomedicalPhysics + - BusinessAdministration + - BusinessAdministrationAccounting + - BusinessAdministrationAccountingAndAdvisoryServices + - BusinessAdministrationBrandManagement + - BusinessAdministrationBusinessAnalytics + - BusinessAdministrationCorporateInnovation + - BusinessAdministrationEntrepreneurialStartups + - BusinessAdministrationFamilyBusiness + - BusinessAdministrationFinance + - BusinessAdministrationFintech + - BusinessAdministrationHealthcareManagementAndConsulting + - BusinessAdministrationManagement + - BusinessAdministrationManagementInformationSystems + - BusinessAdministrationMarketing + - BusinessAdministrationMarketingAnalytics + - BusinessAdministrationSocialInnovationAndEntrepreneurship + - BusinessAdministrationSupplyChainManagement + - CellAndMolecularBiology + - ChemicalEngineering + - Chemistry + - CivilEngineering + - CommunicationStudies + - ComputerEngineering + - ComputerScience + - ComputingAndLaw + - CriminologyAndCriminalJustice + - CulturalAnthropology + - Cybersecurity + - DataScience + - Design + - Economics + - ElectricalEngineering + - English + - EnvironmentalAndSustainabilityStudies + - EnvironmentalEngineering + - EnvironmentalScience + - EnvironmentalStudies + - GameArtAndAnimation + - GameDesign + - GlobalAsianStudies + - HealthScience + - History + - HistoryCultureAndLaw + - HumanServices + - IndustrialEngineering + - InternationalAffairs + - InternationalBusiness + - InternationalBusinessAccounting + - InternationalBusinessAccountingAndAdvisoryServices + - InternationalBusinessBrandManagement + - InternationalBusinessBusinessAnalytics + - InternationalBusinessCorporateInnovation + - InternationalBusinessEntrepreneurialStartups + - InternationalBusinessFamilyBusiness + - InternationalBusinessFinance + - InternationalBusinessFintech + - InternationalBusinessHealthcareManagementAndConsulting + - InternationalBusinessManagement + - InternationalBusinessManagementInformationSystems + - InternationalBusinessMarketing + - InternationalBusinessMarketingAnalytics + - InternationalBusinessSocialInnovationAndEntrepreneurship + - InternationalBusinessSupplyChainManagement + - Journalism + - LandscapeArchitecture + - Linguistics + - MarineBiology + - Mathematics + - MechanicalEngineering + - MediaAndScreenStudies + - MediaArts + - Music + - MusicTechnology + - Nursing + - PharmaceuticalSciences + - PharmacyPharmD + - Philosophy + - Physics + - PoliticalScience + - PoliticsPhilosophyEconomics + - Psychology + - PublicHealth + - PublicRelations + - ReligiousStudies + - Sociology + - Spanish + - SpeechLanguagePathologyAndAudiology + - Theatre + models.PointOfContact: properties: - content: - maxLength: 255 - type: string - end_time: + created_at: + example: "2023-09-20T16:34:50Z" type: string - event_type: - allOf: - - $ref: "#/definitions/models.EventType" - enum: - - open - - membersOnly - maxLength: 255 - host: + email: type: string - location: - maxLength: 255 + id: + example: 123e4567-e89b-12d3-a456-426614174000 type: string name: - maxLength: 255 type: string - preview: - maxLength: 255 + photo_file: + $ref: '#/definitions/models.File' + position: type: string - start_time: + updated_at: + example: "2023-09-20T16:34:50Z" type: string type: object - models.UpdatePasswordRequestBody: + models.RecruitmentCycle: + enum: + - fall + - spring + - fallSpring + - always + type: string + x-enum-varnames: + - Fall + - Spring + - FallSpring + - Always + models.RecruitmentType: + enum: + - unrestricted + - tryout + - application + type: string + x-enum-varnames: + - Unrestricted + - Tryout + - Application + models.Tag: properties: - new_password: - description: "MARK: must be validated manually" - maxLength: 255 + category_id: type: string - old_password: - description: "MARK: must be validated manually" - maxLength: 255 + created_at: + example: "2023-09-20T16:34:50Z" type: string - required: - - new_password - - old_password - type: object - models.UpdateSeriesRequestBody: - properties: - event_details: - $ref: "#/definitions/events.UpdateEventRequestBody" - max_occurrences: - minimum: 2 - type: integer - recurring_type: - allOf: - - $ref: "#/definitions/models.RecurringType" - enum: - - daily - - weekly - - monthly - maxLength: 255 - type: object - UpdateTagRequestBody: - properties: - category_id: + id: + example: 123e4567-e89b-12d3-a456-426614174000 type: string name: - maxLength: 255 - type: string - type: object - UpdateUserRequestBody: - properties: - college: - allOf: - - $ref: "#/definitions/models.College" - enum: - - CAMD - - DMSB - - KCCS - - CE - - BCHS - - SL - - CPS - - CS - - CSSH - first_name: - maxLength: 255 type: string - graduation_cycle: - allOf: - - $ref: "#/definitions/models.GraduationCycle" - enum: - - december - - may - maxLength: 255 - graduation_year: - type: integer - last_name: - maxLength: 255 + updated_at: + example: "2023-09-20T16:34:50Z" type: string - major0: - allOf: - - $ref: "#/definitions/models.Major" - enum: - - africanaStudies - - americanSignLanguage - - americanSignLanguage-EnglishInterpreting - - appliedPhysics - - architecturalStudies - - architecture - - art:ArtVisualStudies - - behavioralNeuroscience - - biochemistry - - bioengineering - - biology - - biomedicalPhysics - - businessAdministration - - businessAdministration:Accounting - - businessAdministration:AccountingAndAdvisoryServices - - businessAdministration:BrandManagement - - businessAdministration:BusinessAnalytics - - businessAdministration:CorporateInnovation - - businessAdministration:EntrepreneurialStartups - - businessAdministration:FamilyBusiness - - businessAdministration:Finance - - businessAdministration:Fintech - - businessAdministration:HealthcareManagementAndConsulting - - businessAdministration:Management - - businessAdministration:ManagementInformationSystems - - businessAdministration:Marketing - - businessAdministration:MarketingAnalytics - - businessAdministration:SocialInnovationAndEntrepreneurship - - businessAdministration:SupplyChainManagement - - cellAndMolecularBiology - - chemicalEngineering - - chemistry - - civilEngineering - - communicationStudies - - computerEngineering - - computerScience - - computingAndLaw - - criminologyAndCriminalJustice - - culturalAnthropology - - cybersecurity - - dataScience - - design - - economics - - electricalEngineering - - english - - environmentalAndSustainabilityStudies - - environmentalEngineering - - environmentalScience - - environmentalStudies - - gameArtAndAnimation - - gameDesign - - globalAsianStudies - - healthScience - - history - - historyCultureAndLaw - - humanServices - - industrialEngineering - - internationalAffairs - - internationalBusiness - - internationalBusiness:Accounting - - internationalBusiness:AccountingAndAdvisoryServices - - internationalBusiness:BrandManagement - - internationalBusiness:BusinessAnalytics - - internationalBusiness:CorporateInnovation - - internationalBusiness:EntrepreneurialStartups - - internationalBusiness:FamilyBusiness - - internationalBusiness:Finance - - internationalBusiness:Fintech - - internationalBusiness:HealthcareManagementAndConsulting - - internationalBusiness:Management - - internationalBusiness:ManagementInformationSystems - - internationalBusiness:Marketing - - internationalBusiness:MarketingAnalytics - - internationalBusiness:SocialInnovationAndEntrepreneurship - - internationalBusiness:SupplyChainManagement - - journalism - - landscapeArchitecture - - linguistics - - marineBiology - - mathematics - - mechanicalEngineering - - mediaAndScreenStudies - - mediaArts - - music - - musicTechnology - - nursing - - pharmaceuticalSciences - - pharmacy(PharmD) - - philosophy - - physics - - politicalScience - - politicsPhilosophyEconomics - - psychology - - publicHealth - - publicRelations - - religiousStudies - - sociology - - spanish - - speechLanguagePathologyAndAudiology - - theatre - maxLength: 255 - major1: - allOf: - - $ref: "#/definitions/models.Major" - enum: - - africanaStudies - - americanSignLanguage - - americanSignLanguage-EnglishInterpreting - - appliedPhysics - - architecturalStudies - - architecture - - art:ArtVisualStudies - - behavioralNeuroscience - - biochemistry - - bioengineering - - biology - - biomedicalPhysics - - businessAdministration - - businessAdministration:Accounting - - businessAdministration:AccountingAndAdvisoryServices - - businessAdministration:BrandManagement - - businessAdministration:BusinessAnalytics - - businessAdministration:CorporateInnovation - - businessAdministration:EntrepreneurialStartups - - businessAdministration:FamilyBusiness - - businessAdministration:Finance - - businessAdministration:Fintech - - businessAdministration:HealthcareManagementAndConsulting - - businessAdministration:Management - - businessAdministration:ManagementInformationSystems - - businessAdministration:Marketing - - businessAdministration:MarketingAnalytics - - businessAdministration:SocialInnovationAndEntrepreneurship - - businessAdministration:SupplyChainManagement - - cellAndMolecularBiology - - chemicalEngineering - - chemistry - - civilEngineering - - communicationStudies - - computerEngineering - - computerScience - - computingAndLaw - - criminologyAndCriminalJustice - - culturalAnthropology - - cybersecurity - - dataScience - - design - - economics - - electricalEngineering - - english - - environmentalAndSustainabilityStudies - - environmentalEngineering - - environmentalScience - - environmentalStudies - - gameArtAndAnimation - - gameDesign - - globalAsianStudies - - healthScience - - history - - historyCultureAndLaw - - humanServices - - industrialEngineering - - internationalAffairs - - internationalBusiness - - internationalBusiness:Accounting - - internationalBusiness:AccountingAndAdvisoryServices - - internationalBusiness:BrandManagement - - internationalBusiness:BusinessAnalytics - - internationalBusiness:CorporateInnovation - - internationalBusiness:EntrepreneurialStartups - - internationalBusiness:FamilyBusiness - - internationalBusiness:Finance - - internationalBusiness:Fintech - - internationalBusiness:HealthcareManagementAndConsulting - - internationalBusiness:Management - - internationalBusiness:ManagementInformationSystems - - internationalBusiness:Marketing - - internationalBusiness:MarketingAnalytics - - internationalBusiness:SocialInnovationAndEntrepreneurship - - internationalBusiness:SupplyChainManagement - - journalism - - landscapeArchitecture - - linguistics - - marineBiology - - mathematics - - mechanicalEngineering - - mediaAndScreenStudies - - mediaArts - - music - - musicTechnology - - nursing - - pharmaceuticalSciences - - pharmacy(PharmD) - - philosophy - - physics - - politicalScience - - politicsPhilosophyEconomics - - psychology - - publicHealth - - publicRelations - - religiousStudies - - sociology - - spanish - - speechLanguagePathologyAndAudiology - - theatre - maxLength: 255 - major2: - allOf: - - $ref: "#/definitions/models.Major" - enum: - - africanaStudies - - americanSignLanguage - - americanSignLanguage-EnglishInterpreting - - appliedPhysics - - architecturalStudies - - architecture - - art:ArtVisualStudies - - behavioralNeuroscience - - biochemistry - - bioengineering - - biology - - biomedicalPhysics - - businessAdministration - - businessAdministration:Accounting - - businessAdministration:AccountingAndAdvisoryServices - - businessAdministration:BrandManagement - - businessAdministration:BusinessAnalytics - - businessAdministration:CorporateInnovation - - businessAdministration:EntrepreneurialStartups - - businessAdministration:FamilyBusiness - - businessAdministration:Finance - - businessAdministration:Fintech - - businessAdministration:HealthcareManagementAndConsulting - - businessAdministration:Management - - businessAdministration:ManagementInformationSystems - - businessAdministration:Marketing - - businessAdministration:MarketingAnalytics - - businessAdministration:SocialInnovationAndEntrepreneurship - - businessAdministration:SupplyChainManagement - - cellAndMolecularBiology - - chemicalEngineering - - chemistry - - civilEngineering - - communicationStudies - - computerEngineering - - computerScience - - computingAndLaw - - criminologyAndCriminalJustice - - culturalAnthropology - - cybersecurity - - dataScience - - design - - economics - - electricalEngineering - - english - - environmentalAndSustainabilityStudies - - environmentalEngineering - - environmentalScience - - environmentalStudies - - gameArtAndAnimation - - gameDesign - - globalAsianStudies - - healthScience - - history - - historyCultureAndLaw - - humanServices - - industrialEngineering - - internationalAffairs - - internationalBusiness - - internationalBusiness:Accounting - - internationalBusiness:AccountingAndAdvisoryServices - - internationalBusiness:BrandManagement - - internationalBusiness:BusinessAnalytics - - internationalBusiness:CorporateInnovation - - internationalBusiness:EntrepreneurialStartups - - internationalBusiness:FamilyBusiness - - internationalBusiness:Finance - - internationalBusiness:Fintech - - internationalBusiness:HealthcareManagementAndConsulting - - internationalBusiness:Management - - internationalBusiness:ManagementInformationSystems - - internationalBusiness:Marketing - - internationalBusiness:MarketingAnalytics - - internationalBusiness:SocialInnovationAndEntrepreneurship - - internationalBusiness:SupplyChainManagement - - journalism - - landscapeArchitecture - - linguistics - - marineBiology - - mathematics - - mechanicalEngineering - - mediaAndScreenStudies - - mediaArts - - music - - musicTechnology - - nursing - - pharmaceuticalSciences - - pharmacy(PharmD) - - philosophy - - physics - - politicalScience - - politicsPhilosophyEconomics - - psychology - - publicHealth - - publicRelations - - religiousStudies - - sociology - - spanish - - speechLanguagePathologyAndAudiology - - theatre - maxLength: 255 type: object models.User: properties: college: - allOf: - - $ref: "#/definitions/models.College" - maxLength: 255 + $ref: '#/definitions/models.College' created_at: example: "2023-09-20T16:34:50Z" type: string email: - maxLength: 255 type: string first_name: - maxLength: 255 type: string graduation_cycle: - allOf: - - $ref: "#/definitions/models.GraduationCycle" - enum: - - december - - may - maxLength: 255 + $ref: '#/definitions/models.GraduationCycle' graduation_year: type: integer id: @@ -1612,374 +1402,36 @@ definitions: is_verified: type: boolean last_name: - maxLength: 255 type: string major0: - allOf: - - $ref: "#/definitions/models.Major" - enum: - - africanaStudies - - americanSignLanguage - - americanSignLanguage-EnglishInterpreting - - appliedPhysics - - architecturalStudies - - architecture - - art:ArtVisualStudies - - behavioralNeuroscience - - biochemistry - - bioengineering - - biology - - biomedicalPhysics - - businessAdministration - - businessAdministration:Accounting - - businessAdministration:AccountingAndAdvisoryServices - - businessAdministration:BrandManagement - - businessAdministration:BusinessAnalytics - - businessAdministration:CorporateInnovation - - businessAdministration:EntrepreneurialStartups - - businessAdministration:FamilyBusiness - - businessAdministration:Finance - - businessAdministration:Fintech - - businessAdministration:HealthcareManagementAndConsulting - - businessAdministration:Management - - businessAdministration:ManagementInformationSystems - - businessAdministration:Marketing - - businessAdministration:MarketingAnalytics - - businessAdministration:SocialInnovationAndEntrepreneurship - - businessAdministration:SupplyChainManagement - - cellAndMolecularBiology - - chemicalEngineering - - chemistry - - civilEngineering - - communicationStudies - - computerEngineering - - computerScience - - computingAndLaw - - criminologyAndCriminalJustice - - culturalAnthropology - - cybersecurity - - dataScience - - design - - economics - - electricalEngineering - - english - - environmentalAndSustainabilityStudies - - environmentalEngineering - - environmentalScience - - environmentalStudies - - gameArtAndAnimation - - gameDesign - - globalAsianStudies - - healthScience - - history - - historyCultureAndLaw - - humanServices - - industrialEngineering - - internationalAffairs - - internationalBusiness - - internationalBusiness:Accounting - - internationalBusiness:AccountingAndAdvisoryServices - - internationalBusiness:BrandManagement - - internationalBusiness:BusinessAnalytics - - internationalBusiness:CorporateInnovation - - internationalBusiness:EntrepreneurialStartups - - internationalBusiness:FamilyBusiness - - internationalBusiness:Finance - - internationalBusiness:Fintech - - internationalBusiness:HealthcareManagementAndConsulting - - internationalBusiness:Management - - internationalBusiness:ManagementInformationSystems - - internationalBusiness:Marketing - - internationalBusiness:MarketingAnalytics - - internationalBusiness:SocialInnovationAndEntrepreneurship - - internationalBusiness:SupplyChainManagement - - journalism - - landscapeArchitecture - - linguistics - - marineBiology - - mathematics - - mechanicalEngineering - - mediaAndScreenStudies - - mediaArts - - music - - musicTechnology - - nursing - - pharmaceuticalSciences - - pharmacy(PharmD) - - philosophy - - physics - - politicalScience - - politicsPhilosophyEconomics - - psychology - - publicHealth - - publicRelations - - religiousStudies - - sociology - - spanish - - speechLanguagePathologyAndAudiology - - theatre - maxLength: 255 + $ref: '#/definitions/models.Major' major1: - allOf: - - $ref: "#/definitions/models.Major" - enum: - - africanaStudies - - americanSignLanguage - - americanSignLanguage-EnglishInterpreting - - appliedPhysics - - architecturalStudies - - architecture - - art:ArtVisualStudies - - behavioralNeuroscience - - biochemistry - - bioengineering - - biology - - biomedicalPhysics - - businessAdministration - - businessAdministration:Accounting - - businessAdministration:AccountingAndAdvisoryServices - - businessAdministration:BrandManagement - - businessAdministration:BusinessAnalytics - - businessAdministration:CorporateInnovation - - businessAdministration:EntrepreneurialStartups - - businessAdministration:FamilyBusiness - - businessAdministration:Finance - - businessAdministration:Fintech - - businessAdministration:HealthcareManagementAndConsulting - - businessAdministration:Management - - businessAdministration:ManagementInformationSystems - - businessAdministration:Marketing - - businessAdministration:MarketingAnalytics - - businessAdministration:SocialInnovationAndEntrepreneurship - - businessAdministration:SupplyChainManagement - - cellAndMolecularBiology - - chemicalEngineering - - chemistry - - civilEngineering - - communicationStudies - - computerEngineering - - computerScience - - computingAndLaw - - criminologyAndCriminalJustice - - culturalAnthropology - - cybersecurity - - dataScience - - design - - economics - - electricalEngineering - - english - - environmentalAndSustainabilityStudies - - environmentalEngineering - - environmentalScience - - environmentalStudies - - gameArtAndAnimation - - gameDesign - - globalAsianStudies - - healthScience - - history - - historyCultureAndLaw - - humanServices - - industrialEngineering - - internationalAffairs - - internationalBusiness - - internationalBusiness:Accounting - - internationalBusiness:AccountingAndAdvisoryServices - - internationalBusiness:BrandManagement - - internationalBusiness:BusinessAnalytics - - internationalBusiness:CorporateInnovation - - internationalBusiness:EntrepreneurialStartups - - internationalBusiness:FamilyBusiness - - internationalBusiness:Finance - - internationalBusiness:Fintech - - internationalBusiness:HealthcareManagementAndConsulting - - internationalBusiness:Management - - internationalBusiness:ManagementInformationSystems - - internationalBusiness:Marketing - - internationalBusiness:MarketingAnalytics - - internationalBusiness:SocialInnovationAndEntrepreneurship - - internationalBusiness:SupplyChainManagement - - journalism - - landscapeArchitecture - - linguistics - - marineBiology - - mathematics - - mechanicalEngineering - - mediaAndScreenStudies - - mediaArts - - music - - musicTechnology - - nursing - - pharmaceuticalSciences - - pharmacy(PharmD) - - philosophy - - physics - - politicalScience - - politicsPhilosophyEconomics - - psychology - - publicHealth - - publicRelations - - religiousStudies - - sociology - - spanish - - speechLanguagePathologyAndAudiology - - theatre - maxLength: 255 + $ref: '#/definitions/models.Major' major2: - allOf: - - $ref: "#/definitions/models.Major" - enum: - - africanaStudies - - americanSignLanguage - - americanSignLanguage-EnglishInterpreting - - appliedPhysics - - architecturalStudies - - architecture - - art:ArtVisualStudies - - behavioralNeuroscience - - biochemistry - - bioengineering - - biology - - biomedicalPhysics - - businessAdministration - - businessAdministration:Accounting - - businessAdministration:AccountingAndAdvisoryServices - - businessAdministration:BrandManagement - - businessAdministration:BusinessAnalytics - - businessAdministration:CorporateInnovation - - businessAdministration:EntrepreneurialStartups - - businessAdministration:FamilyBusiness - - businessAdministration:Finance - - businessAdministration:Fintech - - businessAdministration:HealthcareManagementAndConsulting - - businessAdministration:Management - - businessAdministration:ManagementInformationSystems - - businessAdministration:Marketing - - businessAdministration:MarketingAnalytics - - businessAdministration:SocialInnovationAndEntrepreneurship - - businessAdministration:SupplyChainManagement - - cellAndMolecularBiology - - chemicalEngineering - - chemistry - - civilEngineering - - communicationStudies - - computerEngineering - - computerScience - - computingAndLaw - - criminologyAndCriminalJustice - - culturalAnthropology - - cybersecurity - - dataScience - - design - - economics - - electricalEngineering - - english - - environmentalAndSustainabilityStudies - - environmentalEngineering - - environmentalScience - - environmentalStudies - - gameArtAndAnimation - - gameDesign - - globalAsianStudies - - healthScience - - history - - historyCultureAndLaw - - humanServices - - industrialEngineering - - internationalAffairs - - internationalBusiness - - internationalBusiness:Accounting - - internationalBusiness:AccountingAndAdvisoryServices - - internationalBusiness:BrandManagement - - internationalBusiness:BusinessAnalytics - - internationalBusiness:CorporateInnovation - - internationalBusiness:EntrepreneurialStartups - - internationalBusiness:FamilyBusiness - - internationalBusiness:Finance - - internationalBusiness:Fintech - - internationalBusiness:HealthcareManagementAndConsulting - - internationalBusiness:Management - - internationalBusiness:ManagementInformationSystems - - internationalBusiness:Marketing - - internationalBusiness:MarketingAnalytics - - internationalBusiness:SocialInnovationAndEntrepreneurship - - internationalBusiness:SupplyChainManagement - - journalism - - landscapeArchitecture - - linguistics - - marineBiology - - mathematics - - mechanicalEngineering - - mediaAndScreenStudies - - mediaArts - - music - - musicTechnology - - nursing - - pharmaceuticalSciences - - pharmacy(PharmD) - - philosophy - - physics - - politicalScience - - politicsPhilosophyEconomics - - psychology - - publicHealth - - publicRelations - - religiousStudies - - sociology - - spanish - - speechLanguagePathologyAndAudiology - - theatre - maxLength: 255 + $ref: '#/definitions/models.Major' role: - enum: - - super - - student type: string updated_at: example: "2023-09-20T16:34:50Z" type: string - required: - - college - - email - - first_name - - graduation_cycle - - graduation_year - - last_name - - major0 - - role - type: object - models.VerifyEmailRequestBody: - properties: - email: - type: string - token: - type: string - required: - - email - - token type: object - models.VerifyPasswordResetTokenRequestBody: + tags.CreateClubTagsRequestBody: properties: - new_password: - minLength: 8 - type: string - token: - type: string - verify_new_password: - minLength: 8 - type: string + tags: + items: + type: string + type: array required: - - new_password - - token - - verify_new_password + - tags type: object - tag.CreateUserTagsBody: + tags.CreateUserTagsBody: properties: tags: items: type: string type: array required: - - tags + - tags type: object utilities.SuccessResponse: properties: @@ -1992,23 +1444,23 @@ paths: /auth/forgot-password: post: consumes: - - application/json + - application/json description: Generates a password reset token operationId: forgot-password parameters: - - description: Email - in: body - name: email - required: true - schema: - type: string + - description: Email + in: body + name: email + required: true + schema: + type: string produces: - - application/json + - application/json responses: "200": description: OK schema: - $ref: "#/definitions/utilities.SuccessResponse" + $ref: '#/definitions/utilities.SuccessResponse' "400": description: Bad Request schema: {} @@ -2020,27 +1472,27 @@ paths: schema: {} summary: Generates a password reset token tags: - - auth + - auth /auth/login: post: consumes: - - application/json + - application/json description: Logs in a user operationId: login-user parameters: - - description: Login Body - in: body - name: loginBody - required: true - schema: - $ref: "#/definitions/models.LoginResponseBody" + - description: Login Body + in: body + name: loginBody + required: true + schema: + $ref: '#/definitions/auth.LoginResponseBody' produces: - - application/json + - application/json responses: "200": description: OK schema: - $ref: "#/definitions/models.User" + $ref: '#/definitions/models.User' "400": description: Bad Request schema: {} @@ -2052,36 +1504,36 @@ paths: schema: {} summary: Logs in a user tags: - - auth + - auth /auth/logout: post: consumes: - - application/json + - application/json description: Logs out a user operationId: logout-user produces: - - application/json + - application/json responses: "200": description: OK schema: - $ref: "#/definitions/utilities.SuccessResponse" + $ref: '#/definitions/utilities.SuccessResponse' summary: Logs out a user tags: - - auth + - auth /auth/me: get: consumes: - - application/json + - application/json description: Retrieves the currently authenticated user operationId: get-me produces: - - application/json + - application/json responses: "200": description: OK schema: - $ref: "#/definitions/models.User" + $ref: '#/definitions/models.User' "400": description: Bad Request schema: {} @@ -2095,23 +1547,23 @@ paths: description: Internal Server Error schema: {} security: - - Bearer: [] + - Bearer: [] summary: Retrieves the currently authenticated user tags: - - auth + - auth /auth/refresh: post: consumes: - - application/json + - application/json description: Refreshes a user's access token operationId: refresh-user produces: - - application/json + - application/json responses: "200": description: OK schema: - $ref: "#/definitions/utilities.SuccessResponse" + $ref: '#/definitions/utilities.SuccessResponse' "400": description: Bad Request schema: {} @@ -2123,27 +1575,59 @@ paths: schema: {} summary: Refreshes a user's access token tags: - - auth - /auth/send-code: + - auth + /auth/register: post: consumes: - - application/json - description: Sends a verification code - operationId: send-verification-code + - application/json + description: Registers a user + operationId: register-user parameters: - - description: Email - in: body - name: email - required: true - schema: - type: string + - description: User Body + in: body + name: userBody + required: true + schema: + $ref: '#/definitions/base.CreateUserRequestBody' produces: - - application/json + - application/json responses: - "200": + "201": + description: Created + schema: + $ref: '#/definitions/models.User' + "400": + description: Bad Request + schema: {} + "404": + description: Not Found + schema: {} + "500": + description: Internal Server Error + schema: {} + summary: Registers a user + tags: + - auth + /auth/send-code: + post: + consumes: + - application/json + description: Sends a verification code + operationId: send-verification-code + parameters: + - description: Email + in: body + name: email + required: true + schema: + type: string + produces: + - application/json + responses: + "200": description: OK schema: - $ref: "#/definitions/utilities.SuccessResponse" + $ref: '#/definitions/utilities.SuccessResponse' "400": description: Bad Request schema: {} @@ -2155,27 +1639,27 @@ paths: schema: {} summary: Sends a verification code tags: - - auth + - auth /auth/verify-email: post: consumes: - - application/json + - application/json description: Verifies an email operationId: verify-email parameters: - - description: Email Verification Token Body - in: body - name: tokenBody - required: true - schema: - $ref: "#/definitions/models.VerifyEmailRequestBody" + - description: Email Verification Token Body + in: body + name: tokenBody + required: true + schema: + $ref: '#/definitions/base.VerifyEmailRequestBody' produces: - - application/json + - application/json responses: "200": description: OK schema: - $ref: "#/definitions/utilities.SuccessResponse" + $ref: '#/definitions/utilities.SuccessResponse' "400": description: Bad Request schema: {} @@ -2187,27 +1671,27 @@ paths: schema: {} summary: Verifies an email tags: - - auth + - auth /auth/verify-reset: post: consumes: - - application/json + - application/json description: Verifies a password reset token operationId: verify-password-reset-token parameters: - - description: Password Reset Token Body - in: body - name: tokenBody - required: true - schema: - $ref: "#/definitions/models.VerifyPasswordResetTokenRequestBody" + - description: Password Reset Token Body + in: body + name: tokenBody + required: true + schema: + $ref: '#/definitions/base.VerifyPasswordResetTokenRequestBody' produces: - - application/json + - application/json responses: "200": description: OK schema: - $ref: "#/definitions/utilities.SuccessResponse" + $ref: '#/definitions/utilities.SuccessResponse' "400": description: Bad Request schema: {} @@ -2218,31 +1702,31 @@ paths: description: Internal Server Error schema: {} security: - - Bearer: [] + - Bearer: [] summary: Verifies a password reset token tags: - - auth + - auth /categories/: get: description: Retrieves all categories operationId: get-categories parameters: - - description: Limit - in: query - name: limit - type: integer - - description: Page - in: query - name: page - type: integer + - description: Limit + in: query + name: limit + type: integer + - description: Page + in: query + name: page + type: integer produces: - - application/json + - application/json responses: "200": description: OK schema: items: - $ref: "#/definitions/models.Category" + $ref: '#/definitions/models.Category' type: array "400": description: Bad Request @@ -2258,26 +1742,26 @@ paths: type: string summary: Retrieve all categories tags: - - category + - category post: consumes: - - application/json + - application/json description: Creates a category operationId: create-category parameters: - - description: Category Body - in: body - name: categoryBody - required: true - schema: - $ref: "#/definitions/categories.CategoryRequestBody" + - description: Category Body + in: body + name: categoryBody + required: true + schema: + $ref: '#/definitions/categories.CategoryRequestBody' produces: - - application/json + - application/json responses: "201": description: Created schema: - $ref: "#/definitions/models.Category" + $ref: '#/definitions/models.Category' "400": description: Bad Request schema: @@ -2300,19 +1784,19 @@ paths: type: string summary: Creates a category tags: - - category + - category /categories/{categoryID}/: delete: description: Deletes a category operationId: delete-category parameters: - - description: Category ID - in: path - name: categoryID - required: true - type: string + - description: Category ID + in: path + name: categoryID + required: true + type: string produces: - - application/json + - application/json responses: "204": description: No Content @@ -2336,23 +1820,23 @@ paths: type: string summary: Deletes a category tags: - - category + - category get: description: Retrieves a category operationId: get-category parameters: - - description: Category ID - in: path - name: categoryID - required: true - type: string + - description: Category ID + in: path + name: categoryID + required: true + type: string produces: - - application/json + - application/json responses: "200": description: OK schema: - $ref: "#/definitions/models.Category" + $ref: '#/definitions/models.Category' "400": description: Bad Request schema: @@ -2367,31 +1851,31 @@ paths: type: string summary: Retrieve a category tags: - - category + - category patch: consumes: - - application/json + - application/json description: Updates a category operationId: update-category parameters: - - description: Category ID - in: path - name: categoryID - required: true - type: string - - description: Category Body - in: body - name: categoryBody - required: true - schema: - $ref: "#/definitions/categories.CategoryRequestBody" + - description: Category ID + in: path + name: categoryID + required: true + type: string + - description: Category Body + in: body + name: categoryBody + required: true + schema: + $ref: '#/definitions/categories.CategoryRequestBody' produces: - - application/json + - application/json responses: "200": description: OK schema: - $ref: "#/definitions/models.Category" + $ref: '#/definitions/models.Category' "400": description: Bad Request schema: @@ -2410,33 +1894,33 @@ paths: type: string summary: Updates a category tags: - - category + - category /categories/{categoryID}/tags/: get: description: Retrieves all tags associated with a category operationId: get-tags-by-category parameters: - - description: Category ID - in: path - name: categoryID - required: true - type: string - - description: Limit - in: query - name: limit - type: integer - - description: Page - in: query - name: page - type: integer + - description: Category ID + in: path + name: categoryID + required: true + type: string + - description: Limit + in: query + name: limit + type: integer + - description: Page + in: query + name: page + type: integer produces: - - application/json + - application/json responses: "200": description: OK schema: items: - $ref: "#/definitions/models.Tag" + $ref: '#/definitions/models.Tag' type: array "400": description: Bad Request @@ -2449,488 +1933,91 @@ paths: schema: {} summary: Retrieve all tags by category tags: - - category-tag + - category-tag /categories/{categoryID}/tags/{tagID}/: get: description: Retrieves a tag associated with a category - operationId: get-tag-by-category - parameters: - - description: Category ID - in: path - name: categoryID - required: true - type: string - - description: Tag ID - in: path - name: tagID - required: true - type: string - produces: - - application/json - responses: - "200": - description: OK - schema: - $ref: "#/definitions/models.Tag" - "400": - description: Bad Request - schema: {} - "404": - description: Not Found - schema: {} - "500": - description: Internal Server Error - schema: {} - summary: Retrieve a tag by category - tags: - - category-tag - /clubs/: - get: - description: Retrieves all clubs - operationId: get-all-clubs - parameters: - - description: Limit - in: query - name: limit - type: integer - - description: Page - in: query - name: page - type: integer - produces: - - application/json - responses: - "200": - description: OK - schema: - items: - $ref: "#/definitions/models.Club" - type: array - "400": - description: Bad Request - schema: {} - "500": - description: Internal Server Error - schema: {} - summary: Retrieve all clubs - tags: - - club - post: - consumes: - - application/json - description: Creates a club - operationId: create-club - parameters: - - description: Club - in: body - name: club - required: true - schema: - $ref: "#/definitions/CreateClubRequestBody" - produces: - - application/json - responses: - "201": - description: Created - schema: - $ref: "#/definitions/models.Club" - "400": - description: Bad Request - schema: {} - "401": - description: Unauthorized - schema: {} - "404": - description: Not Found - schema: {} - "500": - description: Internal Server Error - schema: {} - summary: Create a club - tags: - - club - /clubs/{clubID}/: - delete: - description: Deletes a club - operationId: delete-club - parameters: - - description: Club ID - in: path - name: clubID - required: true - type: string - produces: - - application/json - responses: - "204": - description: No Content - schema: - type: string - "400": - description: Bad Request - schema: {} - "401": - description: Unauthorized - schema: {} - "404": - description: Not Found - schema: {} - "500": - description: Internal Server Error - schema: {} - summary: Delete a club - tags: - - club - get: - description: Retrieves a club - operationId: get-club - parameters: - - description: Club ID - in: path - name: clubID - required: true - type: string - produces: - - application/json - responses: - "200": - description: OK - schema: - $ref: "#/definitions/models.Club" - "400": - description: Bad Request - schema: {} - "404": - description: Not Found - schema: {} - "500": - description: Internal Server Error - schema: {} - summary: Retrieve a club - tags: - - club - patch: - consumes: - - application/json - description: Updates a club - operationId: update-club - parameters: - - description: Club ID - in: path - name: clubID - required: true - type: string - - description: Club - in: body - name: club - required: true - schema: - $ref: "#/definitions/UpdateClubRequestBody" - produces: - - application/json - responses: - "200": - description: OK - schema: - $ref: "#/definitions/models.Club" - "400": - description: Bad Request - schema: {} - "401": - description: Unauthorized - schema: {} - "404": - description: Not Found - schema: {} - "500": - description: Internal Server Error - schema: {} - summary: Update a club - tags: - - club - /clubs/{clubID}/contacts/: - get: - description: Retrieves all contacts associated with a club - operationId: get-contacts-by-club - parameters: - - description: Club ID - in: path - name: clubID - required: true - type: string - produces: - - application/json - responses: - "200": - description: OK - schema: - items: - $ref: "#/definitions/models.Contact" - type: array - "400": - description: Bad Request - schema: {} - "404": - description: Not Found - schema: {} - "500": - description: Internal Server Error - schema: {} - summary: Retrieve all contacts for a club - tags: - - club-contact - put: - consumes: - - application/json - description: Creates a contact - operationId: put-contact - parameters: - - description: Club ID - in: path - name: clubID - required: true - type: string - - description: Contact Body - in: body - name: contactBody - required: true - schema: - $ref: "#/definitions/PutContactRequestBody" - produces: - - application/json - responses: - "201": - description: Created - schema: - $ref: "#/definitions/models.Contact" - "400": - description: Bad Request - schema: {} - "401": - description: Unauthorized - schema: {} - "404": - description: Not Found - schema: {} - "500": - description: Internal Server Error - schema: {} - summary: Creates a contact - tags: - - club-contact - /clubs/{clubID}/events/: - get: - description: Retrieves all events associated with a club - operationId: get-events-by-club - parameters: - - description: Club ID - in: path - name: clubID - required: true - type: string - - description: Limit - in: query - name: limit - type: integer - - description: Page - in: query - name: page - type: integer - produces: - - application/json - responses: - "200": - description: OK - schema: - items: - $ref: "#/definitions/models.Event" - type: array - "400": - description: Bad Request - schema: {} - "404": - description: Not Found - schema: {} - "500": - description: Internal Server Error - schema: {} - summary: Retrieve all events for a club - tags: - - club-event - /clubs/{clubID}/followers/: - get: - description: Retrieves all followers associated with a club - operationId: get-followers-by-club - parameters: - - description: Club ID - in: path - name: clubID - required: true - type: string - - description: Limit - in: query - name: limit - type: integer - - description: Page - in: query - name: page - type: integer - produces: - - application/json - responses: - "200": - description: OK - schema: - items: - $ref: "#/definitions/models.User" - type: array - "400": - description: Bad Request - schema: {} - "404": - description: Not Found - schema: {} - "500": - description: Internal Server Error - schema: {} - summary: Retrieve all followers for a club - tags: - - club-follower - /clubs/{clubID}/members/: - delete: - description: Deletes a member associated with a club - operationId: delete-member-from-club - parameters: - - description: Club ID - in: path - name: clubID - required: true - type: string - - description: User ID - in: path - name: userID - required: true - type: string - produces: - - application/json - responses: - "204": - description: No Content - schema: - $ref: "#/definitions/models.User" - "400": - description: Bad Request - schema: {} - "401": - description: Unauthorized - schema: {} - "404": - description: Not Found - schema: {} - "500": - description: Internal Server Error - schema: {} - summary: Delete a member from a club - tags: - - club-member - get: - description: Retrieves all members associated with a club - operationId: get-members-by-club + operationId: get-tag-by-category parameters: - - description: Club ID - in: path - name: clubID - required: true - type: string - - description: Limit - in: query - name: limit - type: integer - - description: Page - in: query - name: page - type: integer + - description: Category ID + in: path + name: categoryID + required: true + type: string + - description: Tag ID + in: path + name: tagID + required: true + type: string produces: - - application/json + - application/json responses: "200": description: OK schema: - items: - $ref: "#/definitions/models.User" - type: array + $ref: '#/definitions/models.Tag' "400": description: Bad Request schema: {} - "401": - description: Unauthorized - schema: {} "404": description: Not Found schema: {} "500": description: Internal Server Error schema: {} - summary: Retrieve all members for a club + summary: Retrieve a tag by category tags: - - club-member - post: - consumes: - - application/json - description: Creates a new member associated with a club - operationId: create-member-for-club + - category-tag + /clubs/: + get: + description: Retrieves all clubs + operationId: get-all-clubs parameters: - - description: Club ID - in: path - name: clubID - required: true - type: string - - description: User ID - in: path - name: userID - required: true - type: string + - description: Limit + in: query + name: limit + type: integer + - description: Page + in: query + name: page + type: integer produces: - - application/json + - application/json responses: - "201": - description: Created + "200": + description: OK schema: - $ref: "#/definitions/models.User" + items: + $ref: '#/definitions/models.Club' + type: array "400": description: Bad Request schema: {} - "401": - description: Unauthorized - schema: {} - "404": - description: Not Found - schema: {} "500": description: Internal Server Error schema: {} - summary: Create a new member for a club + summary: Retrieve all clubs tags: - - club-member - /clubs/{clubID}/poc/: + - club post: consumes: - - multipart/form-data - description: Creates a point of contact associated with a club - operationId: create-point-of-contact-by-club + - application/json + description: Creates a club + operationId: create-club parameters: - - description: Club ID - in: path - name: clubID - required: true - type: string + - description: Club + in: body + name: club + required: true + schema: + $ref: '#/definitions/base.CreateClubRequestBody' produces: - - application/json + - application/json responses: "201": description: Created schema: - $ref: "#/definitions/models.PointOfContact" + $ref: '#/definitions/models.Club' "400": description: Bad Request schema: {} @@ -2943,102 +2030,93 @@ paths: "500": description: Internal Server Error schema: {} - summary: Create a point of contact for a club + summary: Create a club tags: - - club-point-of-contact - /clubs/{clubID}/poc/{pocID}: + - club + /clubs/{clubID}/: delete: - description: Delete a point of contact associated with a club - operationId: delete-point-of-contact-by-club + description: Deletes a club + operationId: delete-club parameters: - - description: Club ID - in: path - name: clubID - required: true - type: string - - description: Point of Contact ID - in: path - name: pocID - required: true - type: string + - description: Club ID + in: path + name: clubID + required: true + type: string produces: - - application/json + - application/json responses: "204": description: No Content + schema: + type: string "400": description: Bad Request schema: {} + "401": + description: Unauthorized + schema: {} "404": description: Not Found schema: {} "500": description: Internal Server Error schema: {} - summary: Delete a point of contact for a club + summary: Delete a club tags: - - club-point-of-contact - patch: - consumes: - - multipart/form-data - description: Updates a point of contact photo associated with a club - operationId: update-point-of-contact-photo-by-club + - club + get: + description: Retrieves a club + operationId: get-club parameters: - - description: Club ID - in: path - name: clubID - required: true - type: string - - description: Point of Contact ID - in: path - name: pocID - required: true - type: string + - description: Club ID + in: path + name: clubID + required: true + type: string produces: - - application/json + - application/json responses: "200": description: OK schema: - $ref: "#/definitions/models.PointOfContact" + $ref: '#/definitions/models.Club' "400": description: Bad Request schema: {} - "401": - description: Unauthorized - schema: {} "404": description: Not Found schema: {} "500": description: Internal Server Error schema: {} - summary: Update a point of contact photo for a club + summary: Retrieve a club tags: - - club-point-of-contact - put: + - club + patch: consumes: - - application/json - description: Updates a point of contact associated with a club - operationId: update-point-of-contact-by-club + - application/json + description: Updates a club + operationId: update-club parameters: - - description: Club ID - in: path - name: clubID - required: true - type: string - - description: Point of Contact ID - in: path - name: pocID - required: true - type: string + - description: Club ID + in: path + name: clubID + required: true + type: string + - description: Club + in: body + name: club + required: true + schema: + $ref: '#/definitions/base.UpdateClubRequestBody' produces: - - application/json + - application/json responses: "200": description: OK schema: - $ref: "#/definitions/models.PointOfContact" + $ref: '#/definitions/models.Club' "400": description: Bad Request schema: {} @@ -3051,27 +2129,27 @@ paths: "500": description: Internal Server Error schema: {} - summary: Update a point of contact for a club + summary: Update a club tags: - - club-point-of-contact - /clubs/{clubID}/pocs/: + - club + /clubs/{clubID}/contacts/: get: - description: Retrieves all point of contacts associated with a club - operationId: get-point-of-contacts-by-club + description: Retrieves all contacts associated with a club + operationId: get-contacts-by-club parameters: - - description: Club ID - in: path - name: clubID - required: true - type: string + - description: Club ID + in: path + name: clubID + required: true + type: string produces: - - application/json + - application/json responses: "200": description: OK schema: items: - $ref: "#/definitions/models.PointOfContact" + $ref: '#/definitions/models.Contact' type: array "400": description: Bad Request @@ -3082,61 +2160,74 @@ paths: "500": description: Internal Server Error schema: {} - summary: Retrieve all point of contacts for a club + summary: Retrieve all contacts for a club tags: - - club-point-of-contact - /clubs/{clubID}/pocs/{pocID}: - get: - description: Retrieves a point of contact associated with a club - operationId: get-point-of-contact-by-club + - club-contact + put: + consumes: + - application/json + description: Creates a contact + operationId: put-contact parameters: - - description: Club ID - in: path - name: clubID - required: true - type: string - - description: Point of Contact ID - in: path - name: pocID - required: true - type: string + - description: Club ID + in: path + name: clubID + required: true + type: string + - description: Contact Body + in: body + name: contactBody + required: true + schema: + $ref: '#/definitions/contacts.PutContactRequestBody' produces: - - application/json + - application/json responses: - "200": - description: OK + "201": + description: Created schema: - $ref: "#/definitions/models.PointOfContact" + $ref: '#/definitions/models.Contact' "400": description: Bad Request schema: {} + "401": + description: Unauthorized + schema: {} "404": description: Not Found schema: {} "500": description: Internal Server Error schema: {} - summary: Retrieve a point of contact for a club + summary: Creates a contact tags: - - club-point-of-contact - /clubs/{clubID}/tags/: + - club-contact + /clubs/{clubID}/events/: get: - description: Retrieves all tags associated with a club - operationId: get-tags-by-club + description: Retrieves all events associated with a club + operationId: get-events-by-club parameters: - - description: Club ID - in: path - name: clubID - required: true - type: string + - description: Club ID + in: path + name: clubID + required: true + type: string + - description: Limit + in: query + name: limit + type: integer + - description: Page + in: query + name: page + type: integer produces: - - application/json + - application/json responses: "200": description: OK schema: items: - $ref: "#/definitions/models.Tag" + $ref: '#/definitions/models.Event' type: array "400": description: Bad Request @@ -3147,72 +2238,70 @@ paths: "500": description: Internal Server Error schema: {} - summary: Retrieve all tags for a club + summary: Retrieve all events for a club tags: - - club-tag - post: - consumes: - - application/json - description: Creates tags for a club - operationId: create-club-tags + - club-event + /clubs/{clubID}/followers/: + get: + description: Retrieves all followers associated with a club + operationId: get-followers-by-club parameters: - - description: Club ID - in: path - name: clubID - required: true - type: string - - description: Club Tags Body - in: body - name: clubTagsBody - required: true - schema: - $ref: "#/definitions/CreateClubTagsRequestBody" + - description: Club ID + in: path + name: clubID + required: true + type: string + - description: Limit + in: query + name: limit + type: integer + - description: Page + in: query + name: page + type: integer produces: - - application/json + - application/json responses: - "201": - description: Created + "200": + description: OK schema: items: - $ref: "#/definitions/models.Tag" + $ref: '#/definitions/models.User' type: array "400": description: Bad Request schema: {} - "401": - description: Unauthorized - schema: {} "404": description: Not Found schema: {} "500": description: Internal Server Error schema: {} - summary: Create club tags + summary: Retrieve all followers for a club tags: - - club-tag - /clubs/{clubID}/tags/{tagID}/: + - club-follower + /clubs/{clubID}/members/: delete: - description: Deletes a tag associated with a club - operationId: delete-tag-by-club + description: Deletes a member associated with a club + operationId: delete-member-from-club parameters: - - description: Club ID - in: path - name: clubID - required: true - type: string - - description: Tag ID - in: path - name: tagID - required: true - type: string + - description: Club ID + in: path + name: clubID + required: true + type: string + - description: User ID + in: path + name: userID + required: true + type: string produces: - - application/json + - application/json responses: "204": description: No Content schema: - type: string + $ref: '#/definitions/models.User' "400": description: Bad Request schema: {} @@ -3225,198 +2314,177 @@ paths: "500": description: Internal Server Error schema: {} - summary: Delete a tag for a club + summary: Delete a member from a club tags: - - club-tag - /contacts/: + - club-member get: - description: Retrieves all contacts - operationId: get-contacts + description: Retrieves all members associated with a club + operationId: get-members-by-club parameters: - - description: Limit - in: query - name: limit - type: integer - - description: Page - in: query - name: page - type: integer + - description: Club ID + in: path + name: clubID + required: true + type: string + - description: Limit + in: query + name: limit + type: integer + - description: Page + in: query + name: page + type: integer produces: - - application/json + - application/json responses: "200": description: OK schema: items: - $ref: "#/definitions/models.Contact" + $ref: '#/definitions/models.User' type: array "400": description: Bad Request - schema: - type: string + schema: {} + "401": + description: Unauthorized + schema: {} "404": description: Not Found - schema: - type: string + schema: {} "500": description: Internal Server Error - schema: - type: string - summary: Retrieve all contacts + schema: {} + summary: Retrieve all members for a club tags: - - contact - /contacts/{contactID}/: - delete: + - club-member + post: consumes: - - application/json - description: Deletes a contact - operationId: delete-contact + - application/json + description: Creates a new member associated with a club + operationId: create-member-for-club parameters: - - description: Contact ID - in: path - name: contactID - required: true - type: string + - description: Club ID + in: path + name: clubID + required: true + type: string + - description: User ID + in: path + name: userID + required: true + type: string produces: - - application/json + - application/json responses: "201": description: Created schema: - $ref: "#/definitions/models.Contact" + $ref: '#/definitions/models.User' "400": description: Bad Request - schema: - type: string + schema: {} + "401": + description: Unauthorized + schema: {} "404": description: Not Found - schema: - type: string + schema: {} "500": description: Internal Server Error - schema: - type: string - summary: Deletes a contact + schema: {} + summary: Create a new member for a club tags: - - contact - get: + - club-member + /clubs/{clubID}/poc/: + post: consumes: - - application/json - description: Retrieves a contact by id - operationId: get-contact + - multipart/form-data + description: Creates a point of contact associated with a club + operationId: create-point-of-contact-by-club parameters: - - description: Contact ID - in: path - name: contactID - required: true - type: string + - description: Club ID + in: path + name: clubID + required: true + type: string produces: - - application/json + - application/json responses: "201": description: Created schema: - $ref: "#/definitions/models.Contact" - "400": - description: Bad Request - schema: - type: string - "404": - description: Not Found - schema: - type: string - "500": - description: Internal Server Error - schema: - type: string - summary: Retrieves a contact - tags: - - contact - /events/: - get: - description: Retrieves all events - operationId: get-all-events - parameters: - - description: Limit - in: query - name: limit - type: integer - - description: Page - in: query - name: page - type: integer - produces: - - application/json - responses: - "200": - description: OK - schema: - items: - $ref: "#/definitions/models.Event" - type: array + $ref: '#/definitions/models.PointOfContact' "400": description: Bad Request schema: {} + "401": + description: Unauthorized + schema: {} "404": description: Not Found schema: {} "500": description: Internal Server Error schema: {} - summary: Retrieve all events + summary: Create a point of contact for a club tags: - - event - post: - consumes: - - application/json - description: Creates an event - operationId: create-event + - club-point-of-contact + /clubs/{clubID}/poc/{pocID}: + delete: + description: Delete a point of contact associated with a club + operationId: delete-point-of-contact-by-club parameters: - - description: Event Body - in: body - name: event - required: true - schema: - $ref: "#/definitions/events.CreateEventRequestBody" + - description: Club ID + in: path + name: clubID + required: true + type: string + - description: Point of Contact ID + in: path + name: pocID + required: true + type: string produces: - - application/json + - application/json responses: - "201": - description: Created - schema: - $ref: "#/definitions/models.Event" + "204": + description: No Content "400": description: Bad Request schema: {} - "401": - description: Unauthorized - schema: {} "404": description: Not Found schema: {} "500": description: Internal Server Error schema: {} - summary: Create an event + summary: Delete a point of contact for a club tags: - - event - /events/{eventID}/: - delete: - description: Deletes an event - operationId: delete-event + - club-point-of-contact + patch: + consumes: + - multipart/form-data + description: Updates a point of contact photo associated with a club + operationId: update-point-of-contact-photo-by-club parameters: - - description: Event ID - in: path - name: eventID - required: true - type: string + - description: Club ID + in: path + name: clubID + required: true + type: string + - description: Point of Contact ID + in: path + name: pocID + required: true + type: string produces: - - application/json + - application/json responses: - "204": - description: No Content + "200": + description: OK schema: - type: string + $ref: '#/definitions/models.PointOfContact' "400": description: Bad Request schema: {} @@ -3429,55 +2497,65 @@ paths: "500": description: Internal Server Error schema: {} - summary: Delete an event + summary: Update a point of contact photo for a club tags: - - event - get: - description: Retrieves an event - operationId: get-event + - club-point-of-contact + put: + consumes: + - application/json + description: Updates a point of contact associated with a club + operationId: update-point-of-contact-by-club parameters: - - description: Event ID - in: path - name: eventID - required: true - type: string + - description: Club ID + in: path + name: clubID + required: true + type: string + - description: Point of Contact ID + in: path + name: pocID + required: true + type: string produces: - - application/json + - application/json responses: "200": description: OK schema: - $ref: "#/definitions/models.Event" + $ref: '#/definitions/models.PointOfContact' "400": description: Bad Request schema: {} + "401": + description: Unauthorized + schema: {} "404": description: Not Found schema: {} "500": description: Internal Server Error schema: {} - summary: Retrieve an event + summary: Update a point of contact for a club tags: - - event - /events/{eventID}/hosts: + - club-point-of-contact + /clubs/{clubID}/pocs/: get: - description: Retrieves all hosts associated with an event - operationId: get-hosts-by-event + description: Retrieves all point of contacts associated with a club + operationId: get-point-of-contacts-by-club parameters: - - description: Event ID - in: path - name: eventID - required: true - type: string + - description: Club ID + in: path + name: clubID + required: true + type: string produces: - - application/json + - application/json responses: "200": description: OK schema: items: - $ref: "#/definitions/models.Club" + $ref: '#/definitions/models.PointOfContact' type: array "400": description: Bad Request @@ -3488,58 +2566,61 @@ paths: "500": description: Internal Server Error schema: {} - summary: Retrieve all hosts by event + summary: Retrieve all point of contacts for a club tags: - - event - /events/{eventID}/series/: - delete: - description: Deletes all series associated with an event - operationId: delete-series-by-event + - club-point-of-contact + /clubs/{clubID}/pocs/{pocID}: + get: + description: Retrieves a point of contact associated with a club + operationId: get-point-of-contact-by-club parameters: - - description: Event ID - in: path - name: eventID - required: true - type: string + - description: Club ID + in: path + name: clubID + required: true + type: string + - description: Point of Contact ID + in: path + name: pocID + required: true + type: string produces: - - application/json + - application/json responses: - "204": - description: No Content + "200": + description: OK schema: - type: string + $ref: '#/definitions/models.PointOfContact' "400": description: Bad Request schema: {} - "401": - description: Unauthorized - schema: {} "404": description: Not Found schema: {} "500": description: Internal Server Error schema: {} - summary: Delete all series by event + summary: Retrieve a point of contact for a club tags: - - event + - club-point-of-contact + /clubs/{clubID}/tags/: get: - description: Retrieves all series associated with an event - operationId: get-series-by-event + description: Retrieves all tags associated with a club + operationId: get-tags-by-club parameters: - - description: Event ID - in: path - name: eventID - required: true - type: string + - description: Club ID + in: path + name: clubID + required: true + type: string produces: - - application/json + - application/json responses: "200": description: OK schema: items: - $ref: "#/definitions/models.Series" + $ref: '#/definitions/models.Tag' type: array "400": description: Bad Request @@ -3550,33 +2631,35 @@ paths: "500": description: Internal Server Error schema: {} - summary: Retrieve all series by event + summary: Retrieve all tags for a club tags: - - event - patch: + - club-tag + post: consumes: - - application/json - description: Creates a series - operationId: create-series + - application/json + description: Creates tags for a club + operationId: create-club-tags parameters: - - description: Event ID - in: path - name: eventID - required: true - type: string - - description: Series Body - in: body - name: seriesBody - required: true - schema: - $ref: "#/definitions/events.UpdateEventRequestBody" + - description: Club ID + in: path + name: clubID + required: true + type: string + - description: Club Tags Body + in: body + name: clubTagsBody + required: true + schema: + $ref: '#/definitions/tags.CreateClubTagsRequestBody' produces: - - application/json + - application/json responses: "201": description: Created schema: - $ref: "#/definitions/models.Series" + items: + $ref: '#/definitions/models.Tag' + type: array "400": description: Bad Request schema: {} @@ -3589,26 +2672,26 @@ paths: "500": description: Internal Server Error schema: {} - summary: Create a series + summary: Create club tags tags: - - event - /events/{eventID}/series/{seriesID}/: + - club-tag + /clubs/{clubID}/tags/{tagID}/: delete: - description: Deletes a series by ID - operationId: delete-series-by-id + description: Deletes a tag associated with a club + operationId: delete-tag-by-club parameters: - - description: Event ID - in: path - name: eventID - required: true - type: string - - description: Series ID - in: path - name: seriesID - required: true - type: string + - description: Club ID + in: path + name: clubID + required: true + type: string + - description: Tag ID + in: path + name: tagID + required: true + type: string produces: - - application/json + - application/json responses: "204": description: No Content @@ -3626,100 +2709,164 @@ paths: "500": description: Internal Server Error schema: {} - summary: Delete a series by ID + summary: Delete a tag for a club tags: - - event + - club-tag + /contacts/: get: - description: Retrieves a series by ID - operationId: get-series-by-id + description: Retrieves all contacts + operationId: get-contacts parameters: - - description: Event ID - in: path - name: eventID - required: true - type: string - - description: Series ID - in: path - name: seriesID - required: true - type: string + - description: Limit + in: query + name: limit + type: integer + - description: Page + in: query + name: page + type: integer produces: - - application/json + - application/json responses: "200": description: OK schema: - $ref: "#/definitions/models.Series" + items: + $ref: '#/definitions/models.Contact' + type: array "400": description: Bad Request - schema: {} + schema: + type: string "404": description: Not Found - schema: {} + schema: + type: string "500": description: Internal Server Error - schema: {} - summary: Retrieve a series by ID + schema: + type: string + summary: Retrieve all contacts tags: - - event - patch: + - contact + /contacts/{contactID}/: + delete: consumes: - - application/json - description: Updates a series by event ID - operationId: update-series-by-event-id + - application/json + description: Deletes a contact + operationId: delete-contact parameters: - - description: Event ID - in: path - name: eventID - required: true - type: string - - description: Series Body - in: body - name: seriesBody - required: true + - description: Contact ID + in: path + name: contactID + required: true + type: string + produces: + - application/json + responses: + "201": + description: Created + schema: + $ref: '#/definitions/models.Contact' + "400": + description: Bad Request + schema: + type: string + "404": + description: Not Found + schema: + type: string + "500": + description: Internal Server Error + schema: + type: string + summary: Deletes a contact + tags: + - contact + get: + consumes: + - application/json + description: Retrieves a contact by id + operationId: get-contact + parameters: + - description: Contact ID + in: path + name: contactID + required: true + type: string + produces: + - application/json + responses: + "201": + description: Created schema: - $ref: "#/definitions/models.UpdateSeriesRequestBody" + $ref: '#/definitions/models.Contact' + "400": + description: Bad Request + schema: + type: string + "404": + description: Not Found + schema: + type: string + "500": + description: Internal Server Error + schema: + type: string + summary: Retrieves a contact + tags: + - contact + /events/: + get: + description: Retrieves all events + operationId: get-all-events + parameters: + - description: Limit + in: query + name: limit + type: integer + - description: Page + in: query + name: page + type: integer produces: - - application/json + - application/json responses: "200": description: OK schema: - $ref: "#/definitions/models.Series" + items: + $ref: '#/definitions/models.Event' + type: array "400": description: Bad Request schema: {} - "401": - description: Unauthorized - schema: {} "404": description: Not Found schema: {} "500": description: Internal Server Error schema: {} - summary: Update a series by event ID + summary: Retrieve all events tags: - - event - /events/{eventID}/tags: + - event + /events/{eventID}/: get: - description: Retrieves all tags associated with an event - operationId: get-tags-by-event + description: Retrieves an event + operationId: get-event parameters: - - description: Event ID - in: path - name: eventID - required: true - type: string + - description: Event ID + in: path + name: eventID + required: true + type: string produces: - - application/json + - application/json responses: "200": description: OK schema: - items: - $ref: "#/definitions/models.Tag" - type: array + $ref: '#/definitions/models.Event' "400": description: Bad Request schema: {} @@ -3729,30 +2876,30 @@ paths: "500": description: Internal Server Error schema: {} - summary: Retrieve all tags by event + summary: Retrieve an event tags: - - event + - event /files/: get: description: Retrieves all files operationId: get-files parameters: - - description: Limit - in: query - name: limit - type: integer - - description: Page - in: query - name: page - type: integer + - description: Limit + in: query + name: limit + type: integer + - description: Page + in: query + name: page + type: integer produces: - - application/json + - application/json responses: "200": description: OK schema: items: - $ref: "#/definitions/models.File" + $ref: '#/definitions/models.File' type: array "400": description: Bad Request @@ -3768,26 +2915,26 @@ paths: schema: {} summary: Retrieve all files tags: - - file + - file post: consumes: - - multipart/form-data + - multipart/form-data description: Creates a file operationId: create-file parameters: - - description: File - in: body - name: file - required: true - schema: - $ref: "#/definitions/CreateFileRequestBody" + - description: File + in: body + name: file + required: true + schema: + $ref: '#/definitions/base.CreateFileRequestBody' produces: - - application/json + - application/json responses: "201": description: Created schema: - $ref: "#/definitions/models.File" + $ref: '#/definitions/models.File' "400": description: Bad Request schema: {} @@ -3802,24 +2949,24 @@ paths: schema: {} summary: Create a file tags: - - file + - file /files/:fileID: delete: description: Deletes a file operationId: delete-file parameters: - - description: File ID - in: path - name: fileID - required: true - type: string + - description: File ID + in: path + name: fileID + required: true + type: string produces: - - application/json + - application/json responses: "201": description: Created schema: - $ref: "#/definitions/models.File" + $ref: '#/definitions/models.File' "400": description: Bad Request schema: {} @@ -3834,23 +2981,23 @@ paths: schema: {} summary: Delete a file tags: - - file + - file get: description: Retrieves a file operationId: get-file parameters: - - description: File ID - in: path - name: fileID - required: true - type: string + - description: File ID + in: path + name: fileID + required: true + type: string produces: - - application/json + - application/json responses: "200": description: OK schema: - $ref: "#/definitions/models.File" + $ref: '#/definitions/models.File' "400": description: Bad Request schema: {} @@ -3865,28 +3012,28 @@ paths: schema: {} summary: Retrieve a file tags: - - file + - file /pocs/: get: description: Retrieves all point of contacts operationId: get-point-of-contacts parameters: - - description: Limit - in: query - name: limit - type: integer - - description: Page - in: query - name: page - type: integer + - description: Limit + in: query + name: limit + type: integer + - description: Page + in: query + name: page + type: integer produces: - - application/json + - application/json responses: "200": description: OK schema: items: - $ref: "#/definitions/models.PointOfContact" + $ref: '#/definitions/models.PointOfContact' type: array "400": description: Bad Request @@ -3902,24 +3049,24 @@ paths: type: string summary: Retrieve all point of contacts tags: - - point of contact + - point of contact /pocs/{pocID}/: get: description: Retrieves a point of contact by id operationId: get-point-of-contact parameters: - - description: Point of Contact ID - in: path - name: pocID - required: true - type: string + - description: Point of Contact ID + in: path + name: pocID + required: true + type: string produces: - - application/json + - application/json responses: "200": description: OK schema: - $ref: "#/definitions/models.PointOfContact" + $ref: '#/definitions/models.PointOfContact' "400": description: Bad Request schema: @@ -3934,28 +3081,28 @@ paths: type: string summary: Retrieves a point of contact tags: - - point of contact + - point of contact /tags: get: description: Retrieves all tags operationId: get-all-tags parameters: - - description: Limit - in: query - name: limit - type: integer - - description: Page - in: query - name: page - type: integer + - description: Limit + in: query + name: limit + type: integer + - description: Page + in: query + name: page + type: integer produces: - - application/json + - application/json responses: "200": description: OK schema: items: - $ref: "#/definitions/models.Tag" + $ref: '#/definitions/models.Tag' type: array "400": description: Bad Request @@ -3968,27 +3115,27 @@ paths: schema: {} summary: Retrieve all tags tags: - - tag + - tag /tags/: post: consumes: - - application/json + - application/json description: Creates a tag operationId: create-tag parameters: - - description: Tag Body - in: body - name: tagBody - required: true - schema: - $ref: "#/definitions/CreateTagRequestBody" + - description: Tag Body + in: body + name: tagBody + required: true + schema: + $ref: '#/definitions/base.CreateTagRequestBody' produces: - - application/json + - application/json responses: "201": description: Created schema: - $ref: "#/definitions/models.Tag" + $ref: '#/definitions/models.Tag' "400": description: Bad Request schema: {} @@ -4003,19 +3150,19 @@ paths: schema: {} summary: Create a tag tags: - - tag + - tag /tags/{tagID}/: delete: description: Deletes a tag operationId: delete-tag parameters: - - description: Tag ID - in: path - name: tagID - required: true - type: string + - description: Tag ID + in: path + name: tagID + required: true + type: string produces: - - application/json + - application/json responses: "204": description: No Content @@ -4035,23 +3182,23 @@ paths: schema: {} summary: Delete a tag tags: - - tag + - tag get: description: Retrieves a tag operationId: get-tag parameters: - - description: Tag ID - in: path - name: tagID - required: true - type: string + - description: Tag ID + in: path + name: tagID + required: true + type: string produces: - - application/json + - application/json responses: "200": description: OK schema: - $ref: "#/definitions/models.Tag" + $ref: '#/definitions/models.Tag' "400": description: Bad Request schema: {} @@ -4063,31 +3210,31 @@ paths: schema: {} summary: Retrieve a tag tags: - - tag + - tag patch: consumes: - - application/json + - application/json description: Updates a tag operationId: update-tag parameters: - - description: Tag ID - in: path - name: tagID - required: true - type: string - - description: Tag - in: body - name: tag - required: true - schema: - $ref: "#/definitions/UpdateTagRequestBody" + - description: Tag ID + in: path + name: tagID + required: true + type: string + - description: Tag + in: body + name: tag + required: true + schema: + $ref: '#/definitions/base.UpdateTagRequestBody' produces: - - application/json + - application/json responses: "200": description: OK schema: - $ref: "#/definitions/models.Tag" + $ref: '#/definitions/models.Tag' "400": description: Bad Request schema: {} @@ -4102,28 +3249,28 @@ paths: schema: {} summary: Update a tag tags: - - tag + - tag /users/: get: description: Retrieves all users operationId: get-users parameters: - - description: Limit - in: query - name: limit - type: integer - - description: Page - in: query - name: page - type: integer + - description: Limit + in: query + name: limit + type: integer + - description: Page + in: query + name: page + type: integer produces: - - application/json + - application/json responses: "200": description: OK schema: items: - $ref: "#/definitions/models.User" + $ref: '#/definitions/models.User' type: array "400": description: Bad Request @@ -4136,56 +3283,19 @@ paths: schema: {} summary: Retrieve all users tags: - - user - post: - consumes: - - application/json - description: Creates a user - operationId: create-user - parameters: - - description: User Body - in: body - name: userBody - required: true - schema: - $ref: "#/definitions/CreateUserRequestBody" - produces: - - application/json - responses: - "201": - description: Created - schema: - $ref: "#/definitions/models.User" - "400": - description: Bad Request - schema: {} - "401": - description: Unauthorized - schema: {} - "404": - description: Not Found - schema: {} - "409": - description: Conflict - schema: {} - "500": - description: Internal Server Error - schema: {} - summary: Create a user - tags: - - user + - user /users/{userID}/: delete: description: Deletes a user operationId: delete-user parameters: - - description: User ID - in: path - name: userID - required: true - type: string + - description: User ID + in: path + name: userID + required: true + type: string produces: - - application/json + - application/json responses: "204": description: No Content @@ -4205,23 +3315,23 @@ paths: schema: {} summary: Delete a user tags: - - user + - user get: description: Retrieves a user operationId: get-user parameters: - - description: User ID - in: path - name: userID - required: true - type: string + - description: User ID + in: path + name: userID + required: true + type: string produces: - - application/json + - application/json responses: "200": description: OK schema: - $ref: "#/definitions/models.User" + $ref: '#/definitions/models.User' "400": description: Bad Request schema: {} @@ -4236,31 +3346,31 @@ paths: schema: {} summary: Retrieve a user tags: - - user + - user patch: consumes: - - application/json + - application/json description: Updates a user operationId: update-user parameters: - - description: User ID - in: path - name: userID - required: true - type: string - - description: User Body - in: body - name: userBody - required: true - schema: - $ref: "#/definitions/UpdateUserRequestBody" + - description: User ID + in: path + name: userID + required: true + type: string + - description: User Body + in: body + name: userBody + required: true + schema: + $ref: '#/definitions/base.UpdateUserRequestBody' produces: - - application/json + - application/json responses: "200": description: OK schema: - $ref: "#/definitions/models.User" + $ref: '#/definitions/models.User' "400": description: Bad Request schema: {} @@ -4275,25 +3385,25 @@ paths: schema: {} summary: Update a user tags: - - user + - user /users/{userID}/follower/: get: description: Retrieves all clubs a user is following operationId: get-following parameters: - - description: User ID - in: path - name: userID - required: true - type: string + - description: User ID + in: path + name: userID + required: true + type: string produces: - - application/json + - application/json responses: "200": description: OK schema: items: - $ref: "#/definitions/models.Club" + $ref: '#/definitions/models.Club' type: array "400": description: Bad Request @@ -4309,31 +3419,31 @@ paths: schema: {} summary: Retrieve all clubs a user is following tags: - - user-follower + - user-follower /users/{userID}/follower/{clubID}/: delete: consumes: - - application/json + - application/json description: Unfollow a club operationId: delete-following parameters: - - description: User ID - in: path - name: userID - required: true - type: string - - description: Club ID - in: path - name: clubID - required: true - type: string + - description: User ID + in: path + name: userID + required: true + type: string + - description: Club ID + in: path + name: clubID + required: true + type: string produces: - - application/json + - application/json responses: "204": description: No Content schema: - $ref: "#/definitions/utilities.SuccessResponse" + $ref: '#/definitions/utilities.SuccessResponse' "401": description: Unauthorized schema: {} @@ -4345,30 +3455,30 @@ paths: schema: {} summary: Unfollow a club tags: - - user-follower + - user-follower post: consumes: - - application/json + - application/json description: Follow a club operationId: create-following parameters: - - description: User ID - in: path - name: userID - required: true - type: string - - description: Club ID - in: path - name: clubID - required: true - type: string + - description: User ID + in: path + name: userID + required: true + type: string + - description: Club ID + in: path + name: clubID + required: true + type: string produces: - - application/json + - application/json responses: "201": description: Created schema: - $ref: "#/definitions/utilities.SuccessResponse" + $ref: '#/definitions/utilities.SuccessResponse' "401": description: Unauthorized schema: {} @@ -4380,25 +3490,25 @@ paths: schema: {} summary: Follow a club tags: - - user-follower + - user-follower /users/{userID}/member/: get: description: Retrieves all clubs a user is a member of operationId: get-membership parameters: - - description: User ID - in: path - name: userID - required: true - type: string + - description: User ID + in: path + name: userID + required: true + type: string produces: - - application/json + - application/json responses: "200": description: OK schema: items: - $ref: "#/definitions/models.Club" + $ref: '#/definitions/models.Club' type: array "400": description: Bad Request @@ -4414,27 +3524,27 @@ paths: schema: {} summary: Retrieve all clubs a user is a member of tags: - - user-member + - user-member /users/{userID}/password: patch: consumes: - - application/json + - application/json description: Updates a user's password operationId: update-password parameters: - - description: User ID - in: path - name: userID - required: true - type: string - - description: Password Body - in: body - name: passwordBody - required: true - schema: - $ref: "#/definitions/models.UpdatePasswordRequestBody" + - description: User ID + in: path + name: userID + required: true + type: string + - description: Password Body + in: body + name: passwordBody + required: true + schema: + $ref: '#/definitions/auth.UpdatePasswordRequestBody' produces: - - application/json + - application/json responses: "200": description: OK @@ -4454,21 +3564,21 @@ paths: schema: {} summary: Update a user's password tags: - - user + - user /users/{userID}/tags/: delete: consumes: - - application/json + - application/json description: Creates tags for a user operationId: create-user-tags parameters: - - description: User ID - in: path - name: userID - required: true - type: string + - description: User ID + in: path + name: userID + required: true + type: string produces: - - application/json + - application/json responses: "201": description: Created @@ -4486,24 +3596,24 @@ paths: schema: {} summary: Create user tags tags: - - user-tag + - user-tag get: description: Retrieves all tags associated with a user operationId: get-tags-by-user parameters: - - description: User ID - in: path - name: userID - required: true - type: string + - description: User ID + in: path + name: userID + required: true + type: string produces: - - application/json + - application/json responses: "200": description: OK schema: items: - $ref: "#/definitions/models.Tag" + $ref: '#/definitions/models.Tag' type: array "400": description: Bad Request @@ -4519,32 +3629,32 @@ paths: schema: {} summary: Retrieve all tags for a user tags: - - user-tag + - user-tag post: consumes: - - application/json + - application/json description: Creates tags for a user operationId: create-user-tags parameters: - - description: User ID - in: path - name: userID - required: true - type: string - - description: User Tags Body - in: body - name: userTagsBody - required: true - schema: - $ref: "#/definitions/tag.CreateUserTagsBody" + - description: User ID + in: path + name: userID + required: true + type: string + - description: User Tags Body + in: body + name: userTagsBody + required: true + schema: + $ref: '#/definitions/tags.CreateUserTagsBody' produces: - - application/json + - application/json responses: "201": description: Created schema: items: - $ref: "#/definitions/models.Tag" + $ref: '#/definitions/models.Tag' type: array "400": description: Bad Request @@ -4560,5 +3670,5 @@ paths: schema: {} summary: Create user tags tags: - - user-tag + - user-tag swagger: "2.0" diff --git a/backend/entities/auth/base/controller.go b/backend/entities/auth/base/controller.go index 6c77710d0..cb29fe93d 100644 --- a/backend/entities/auth/base/controller.go +++ b/backend/entities/auth/base/controller.go @@ -5,7 +5,6 @@ import ( "github.com/GenerateNU/sac/backend/auth" authEntities "github.com/GenerateNU/sac/backend/entities/auth" - "github.com/GenerateNU/sac/backend/entities/models" users "github.com/GenerateNU/sac/backend/entities/users/base" "github.com/GenerateNU/sac/backend/utilities" "github.com/gofiber/fiber/v2" @@ -154,7 +153,7 @@ func (a *AuthController) Logout(c *fiber.Ctx) error { // @Failure 500 {object} error // @Router /auth/forgot-password [post] func (a *AuthController) ForgotPassword(c *fiber.Ctx) error { - var emailBody models.EmailRequestBody + var emailBody EmailRequestBody if err := c.BodyParser(&emailBody); err != nil { return utilities.InvalidJSON() @@ -175,7 +174,7 @@ func (a *AuthController) ForgotPassword(c *fiber.Ctx) error { // @Tags auth // @Accept json // @Produce json -// @Param tokenBody body models.VerifyPasswordResetTokenRequestBody true "Password Reset Token Body" +// @Param tokenBody body VerifyPasswordResetTokenRequestBody true "Password Reset Token Body" // @Security Bearer // @Success 200 {object} utilities.SuccessResponse // @Failure 400 {object} error @@ -183,7 +182,7 @@ func (a *AuthController) ForgotPassword(c *fiber.Ctx) error { // @Failure 500 {object} error // @Router /auth/verify-reset [post] func (a *AuthController) VerifyPasswordResetToken(c *fiber.Ctx) error { - var tokenBody models.VerifyPasswordResetTokenRequestBody + var tokenBody VerifyPasswordResetTokenRequestBody if err := c.BodyParser(&tokenBody); err != nil { return utilities.InvalidJSON() @@ -211,7 +210,7 @@ func (a *AuthController) VerifyPasswordResetToken(c *fiber.Ctx) error { // @Failure 500 {object} error // @Router /auth/send-code [post] func (a *AuthController) SendCode(c *fiber.Ctx) error { - var emailBody models.EmailRequestBody + var emailBody EmailRequestBody if err := c.BodyParser(&emailBody); err != nil { return utilities.InvalidJSON() @@ -232,14 +231,14 @@ func (a *AuthController) SendCode(c *fiber.Ctx) error { // @Tags auth // @Accept json // @Produce json -// @Param tokenBody body models.VerifyEmailRequestBody true "Email Verification Token Body" +// @Param tokenBody body VerifyEmailRequestBody true "Email Verification Token Body" // @Success 200 {object} utilities.SuccessResponse // @Failure 400 {object} error // @Failure 429 {object} error // @Failure 500 {object} error // @Router /auth/verify-email [post] func (a *AuthController) VerifyEmail(c *fiber.Ctx) error { - var tokenBody models.VerifyEmailRequestBody + var tokenBody VerifyEmailRequestBody if err := c.BodyParser(&tokenBody); err != nil { return utilities.InvalidJSON() diff --git a/backend/entities/auth/base/models.go b/backend/entities/auth/base/models.go new file mode 100644 index 000000000..32f759f57 --- /dev/null +++ b/backend/entities/auth/base/models.go @@ -0,0 +1,16 @@ +package base + +type VerifyEmailRequestBody struct { + Email string `json:"email" validate:"required,email"` + Token string `json:"token" validate:"required,len=6"` +} + +type VerifyPasswordResetTokenRequestBody struct { + Token string `json:"token" validate:"required"` + NewPassword string `json:"new_password" validate:"required,min=8,password"` + VerifyNewPassword string `json:"verify_new_password" validate:"required,min=8,password,eqfield=NewPassword"` +} + +type EmailRequestBody struct { + Email string `json:"email" validate:"required,email"` +} diff --git a/backend/entities/auth/base/service.go b/backend/entities/auth/base/service.go index 9b8b98d54..c2ebc4371 100644 --- a/backend/entities/auth/base/service.go +++ b/backend/entities/auth/base/service.go @@ -28,10 +28,10 @@ type AuthServiceInterface interface { Logout(c *fiber.Ctx) error SendCode(email string) error - VerifyEmail(emailBody models.VerifyEmailRequestBody) error + VerifyEmail(emailBody VerifyEmailRequestBody) error ForgotPassword(email string) error - VerifyPasswordResetToken(passwordBody models.VerifyPasswordResetTokenRequestBody) error + VerifyPasswordResetToken(passwordBody VerifyPasswordResetTokenRequestBody) error } type AuthService struct { @@ -203,7 +203,7 @@ func (a *AuthService) ForgotPassword(email string) error { return nil } -func (a *AuthService) VerifyPasswordResetToken(passwordBody models.VerifyPasswordResetTokenRequestBody) error { +func (a *AuthService) VerifyPasswordResetToken(passwordBody VerifyPasswordResetTokenRequestBody) error { if err := utilities.Validate(a.Validate, passwordBody); err != nil { return err } @@ -310,7 +310,7 @@ func verifyEmailHelper(user *models.User, token string, db *gorm.DB) error { return nil } -func (a *AuthService) VerifyEmail(emailBody models.VerifyEmailRequestBody) error { +func (a *AuthService) VerifyEmail(emailBody VerifyEmailRequestBody) error { if err := utilities.Validate(a.Validate, emailBody); err != nil { return err } diff --git a/backend/entities/models/club.go b/backend/entities/models/club.go index decfda89b..217338f87 100644 --- a/backend/entities/models/club.go +++ b/backend/entities/models/club.go @@ -8,23 +8,6 @@ import ( "gorm.io/gorm" ) -type RecruitmentCycle string - -const ( - Fall RecruitmentCycle = "fall" - Spring RecruitmentCycle = "spring" - FallSpring RecruitmentCycle = "fallSpring" - Always RecruitmentCycle = "always" -) - -type RecruitmentType string - -const ( - Unrestricted RecruitmentType = "unrestricted" - Tryout RecruitmentType = "tryout" - Application RecruitmentType = "application" -) - type Club struct { Model diff --git a/backend/entities/models/college.go b/backend/entities/models/college.go new file mode 100644 index 000000000..2defefb71 --- /dev/null +++ b/backend/entities/models/college.go @@ -0,0 +1,15 @@ +package models + +type College string + +const ( + CAMD College = "CAMD" // College of Arts, Media and Design + DMSB College = "DMSB" // D'Amore-McKim School of Business + KCCS College = "KCCS" // Khoury College of Computer Sciences + CE College = "CE" // College of Engineering + BCHS College = "BCHS" // Bouvé College of Health Sciences + SL College = "SL" // School of Law + CPS College = "CPS" // College of Professional Studies + CS College = "CS" // College of Science + CSSH College = "CSSH" // College of Social Sciences and Humanities +) diff --git a/backend/entities/models/graduation_cycle.go b/backend/entities/models/graduation_cycle.go new file mode 100644 index 000000000..9bd1f7102 --- /dev/null +++ b/backend/entities/models/graduation_cycle.go @@ -0,0 +1,8 @@ +package models + +type GraduationCycle string + +const ( + December GraduationCycle = "december" + May GraduationCycle = "may" +) diff --git a/backend/entities/models/major.go b/backend/entities/models/major.go new file mode 100644 index 000000000..29da28102 --- /dev/null +++ b/backend/entities/models/major.go @@ -0,0 +1,107 @@ +package models + +type Major string + +// see https://admissions.northeastern.edu/academics/areas-of-study/ +const ( + AfricanaStudies Major = "africanaStudies" + AmericanSignLanguage Major = "americanSignLanguage" + AmericanSignLanguageEnglishInterpreting Major = "americanSignLanguage-EnglishInterpreting" + AppliedPhysics Major = "appliedPhysics" + ArchitecturalStudies Major = "architecturalStudies" + Architecture Major = "architecture" + ArtArtVisualStudies Major = "art:ArtVisualStudies" + BehavioralNeuroscience Major = "behavioralNeuroscience" + Biochemistry Major = "biochemistry" + Bioengineering Major = "bioengineering" + Biology Major = "biology" + BiomedicalPhysics Major = "biomedicalPhysics" + BusinessAdministration Major = "businessAdministration" + BusinessAdministrationAccounting Major = "businessAdministration:Accounting" + BusinessAdministrationAccountingAndAdvisoryServices Major = "businessAdministration:AccountingAndAdvisoryServices" + BusinessAdministrationBrandManagement Major = "businessAdministration:BrandManagement" + BusinessAdministrationBusinessAnalytics Major = "businessAdministration:BusinessAnalytics" + BusinessAdministrationCorporateInnovation Major = "businessAdministration:CorporateInnovation" + BusinessAdministrationEntrepreneurialStartups Major = "businessAdministration:EntrepreneurialStartups" + BusinessAdministrationFamilyBusiness Major = "businessAdministration:FamilyBusiness" + BusinessAdministrationFinance Major = "businessAdministration:Finance" + BusinessAdministrationFintech Major = "businessAdministration:Fintech" + BusinessAdministrationHealthcareManagementAndConsulting Major = "businessAdministration:HealthcareManagementAndConsulting" + BusinessAdministrationManagement Major = "businessAdministration:Management" + BusinessAdministrationManagementInformationSystems Major = "businessAdministration:ManagementInformationSystems" + BusinessAdministrationMarketing Major = "businessAdministration:Marketing" + BusinessAdministrationMarketingAnalytics Major = "businessAdministration:MarketingAnalytics" + BusinessAdministrationSocialInnovationAndEntrepreneurship Major = "businessAdministration:SocialInnovationAndEntrepreneurship" + BusinessAdministrationSupplyChainManagement Major = "businessAdministration:SupplyChainManagement" + CellAndMolecularBiology Major = "cellAndMolecularBiology" + ChemicalEngineering Major = "chemicalEngineering" + Chemistry Major = "chemistry" + CivilEngineering Major = "civilEngineering" + CommunicationStudies Major = "communicationStudies" + ComputerEngineering Major = "computerEngineering" + ComputerScience Major = "computerScience" + ComputingAndLaw Major = "computingAndLaw" + CriminologyAndCriminalJustice Major = "criminologyAndCriminalJustice" + CulturalAnthropology Major = "culturalAnthropology" + Cybersecurity Major = "cybersecurity" + DataScience Major = "dataScience" + Design Major = "design" + Economics Major = "economics" + ElectricalEngineering Major = "electricalEngineering" + English Major = "english" + EnvironmentalAndSustainabilityStudies Major = "environmentalAndSustainabilityStudies" + EnvironmentalEngineering Major = "environmentalEngineering" + EnvironmentalScience Major = "environmentalScience" + EnvironmentalStudies Major = "environmentalStudies" + GameArtAndAnimation Major = "gameArtAndAnimation" + GameDesign Major = "gameDesign" + GlobalAsianStudies Major = "globalAsianStudies" + HealthScience Major = "healthScience" + History Major = "history" + HistoryCultureAndLaw Major = "historyCultureAndLaw" + HumanServices Major = "humanServices" + IndustrialEngineering Major = "industrialEngineering" + InternationalAffairs Major = "internationalAffairs" + InternationalBusiness Major = "internationalBusiness" + InternationalBusinessAccounting Major = "internationalBusiness:Accounting" + InternationalBusinessAccountingAndAdvisoryServices Major = "internationalBusiness:AccountingAndAdvisoryServices" + InternationalBusinessBrandManagement Major = "internationalBusiness:BrandManagement" + InternationalBusinessBusinessAnalytics Major = "internationalBusiness:BusinessAnalytics" + InternationalBusinessCorporateInnovation Major = "internationalBusiness:CorporateInnovation" + InternationalBusinessEntrepreneurialStartups Major = "internationalBusiness:EntrepreneurialStartups" + InternationalBusinessFamilyBusiness Major = "internationalBusiness:FamilyBusiness" + InternationalBusinessFinance Major = "internationalBusiness:Finance" + InternationalBusinessFintech Major = "internationalBusiness:Fintech" + InternationalBusinessHealthcareManagementAndConsulting Major = "internationalBusiness:HealthcareManagementAndConsulting" + InternationalBusinessManagement Major = "internationalBusiness:Management" + InternationalBusinessManagementInformationSystems Major = "internationalBusiness:ManagementInformationSystems" + InternationalBusinessMarketing Major = "internationalBusiness:Marketing" + InternationalBusinessMarketingAnalytics Major = "internationalBusiness:MarketingAnalytics" + InternationalBusinessSocialInnovationAndEntrepreneurship Major = "internationalBusiness:SocialInnovationAndEntrepreneurship" + InternationalBusinessSupplyChainManagement Major = "internationalBusiness:SupplyChainManagement" + Journalism Major = "journalism" + LandscapeArchitecture Major = "landscapeArchitecture" + Linguistics Major = "linguistics" + MarineBiology Major = "marineBiology" + Mathematics Major = "mathematics" + MechanicalEngineering Major = "mechanicalEngineering" + MediaAndScreenStudies Major = "mediaAndScreenStudies" + MediaArts Major = "mediaArts" + Music Major = "music" + MusicTechnology Major = "musicTechnology" + Nursing Major = "nursing" + PharmaceuticalSciences Major = "pharmaceuticalSciences" + PharmacyPharmD Major = "pharmacy(PharmD)" + Philosophy Major = "philosophy" + Physics Major = "physics" + PoliticalScience Major = "politicalScience" + PoliticsPhilosophyEconomics Major = "politicsPhilosophyEconomics" + Psychology Major = "psychology" + PublicHealth Major = "publicHealth" + PublicRelations Major = "publicRelations" + ReligiousStudies Major = "religiousStudies" + Sociology Major = "sociology" + Spanish Major = "spanish" + SpeechLanguagePathologyAndAudiology Major = "speechLanguagePathologyAndAudiology" + Theatre Major = "theatre" +) diff --git a/backend/entities/models/recruitment_cycle.go b/backend/entities/models/recruitment_cycle.go new file mode 100644 index 000000000..95a775f7e --- /dev/null +++ b/backend/entities/models/recruitment_cycle.go @@ -0,0 +1,10 @@ +package models + +type RecruitmentCycle string + +const ( + Fall RecruitmentCycle = "fall" + Spring RecruitmentCycle = "spring" + FallSpring RecruitmentCycle = "fallSpring" + Always RecruitmentCycle = "always" +) diff --git a/backend/entities/models/recruitment_type.go b/backend/entities/models/recruitment_type.go new file mode 100644 index 000000000..6ebcc6542 --- /dev/null +++ b/backend/entities/models/recruitment_type.go @@ -0,0 +1,9 @@ +package models + +type RecruitmentType string + +const ( + Unrestricted RecruitmentType = "unrestricted" + Tryout RecruitmentType = "tryout" + Application RecruitmentType = "application" +) diff --git a/backend/entities/models/role.go b/backend/entities/models/role.go new file mode 100644 index 000000000..0675e6ae1 --- /dev/null +++ b/backend/entities/models/role.go @@ -0,0 +1,8 @@ +package models + +type UserRole string + +var ( + Super UserRole = "super" + Student UserRole = "student" +) diff --git a/backend/entities/models/tokens.go b/backend/entities/models/tokens.go new file mode 100644 index 000000000..b1b527f76 --- /dev/null +++ b/backend/entities/models/tokens.go @@ -0,0 +1,6 @@ +package models + +type Tokens struct { + AccessToken string `json:"access_token"` + RefreshToken string `json:"refresh_token"` +} diff --git a/backend/entities/models/user.go b/backend/entities/models/user.go index 4c2d409fe..bf1bb3b1e 100644 --- a/backend/entities/models/user.go +++ b/backend/entities/models/user.go @@ -4,145 +4,6 @@ import ( "gorm.io/gorm" ) -type UserRole string - -var ( - Super UserRole = "super" - Student UserRole = "student" -) - -type College string - -const ( - CAMD College = "CAMD" // College of Arts, Media and Design - DMSB College = "DMSB" // D'Amore-McKim School of Business - KCCS College = "KCCS" // Khoury College of Computer Sciences - CE College = "CE" // College of Engineering - BCHS College = "BCHS" // Bouvé College of Health Sciences - SL College = "SL" // School of Law - CPS College = "CPS" // College of Professional Studies - CS College = "CS" // College of Science - CSSH College = "CSSH" // College of Social Sciences and Humanities -) - -type Major string - -// see https://admissions.northeastern.edu/academics/areas-of-study/ -const ( - AfricanaStudies Major = "africanaStudies" - AmericanSignLanguage Major = "americanSignLanguage" - AmericanSignLanguageEnglishInterpreting Major = "americanSignLanguage-EnglishInterpreting" - AppliedPhysics Major = "appliedPhysics" - ArchitecturalStudies Major = "architecturalStudies" - Architecture Major = "architecture" - ArtArtVisualStudies Major = "art:ArtVisualStudies" - BehavioralNeuroscience Major = "behavioralNeuroscience" - Biochemistry Major = "biochemistry" - Bioengineering Major = "bioengineering" - Biology Major = "biology" - BiomedicalPhysics Major = "biomedicalPhysics" - BusinessAdministration Major = "businessAdministration" - BusinessAdministrationAccounting Major = "businessAdministration:Accounting" - BusinessAdministrationAccountingAndAdvisoryServices Major = "businessAdministration:AccountingAndAdvisoryServices" - BusinessAdministrationBrandManagement Major = "businessAdministration:BrandManagement" - BusinessAdministrationBusinessAnalytics Major = "businessAdministration:BusinessAnalytics" - BusinessAdministrationCorporateInnovation Major = "businessAdministration:CorporateInnovation" - BusinessAdministrationEntrepreneurialStartups Major = "businessAdministration:EntrepreneurialStartups" - BusinessAdministrationFamilyBusiness Major = "businessAdministration:FamilyBusiness" - BusinessAdministrationFinance Major = "businessAdministration:Finance" - BusinessAdministrationFintech Major = "businessAdministration:Fintech" - BusinessAdministrationHealthcareManagementAndConsulting Major = "businessAdministration:HealthcareManagementAndConsulting" - BusinessAdministrationManagement Major = "businessAdministration:Management" - BusinessAdministrationManagementInformationSystems Major = "businessAdministration:ManagementInformationSystems" - BusinessAdministrationMarketing Major = "businessAdministration:Marketing" - BusinessAdministrationMarketingAnalytics Major = "businessAdministration:MarketingAnalytics" - BusinessAdministrationSocialInnovationAndEntrepreneurship Major = "businessAdministration:SocialInnovationAndEntrepreneurship" - BusinessAdministrationSupplyChainManagement Major = "businessAdministration:SupplyChainManagement" - CellAndMolecularBiology Major = "cellAndMolecularBiology" - ChemicalEngineering Major = "chemicalEngineering" - Chemistry Major = "chemistry" - CivilEngineering Major = "civilEngineering" - CommunicationStudies Major = "communicationStudies" - ComputerEngineering Major = "computerEngineering" - ComputerScience Major = "computerScience" - ComputingAndLaw Major = "computingAndLaw" - CriminologyAndCriminalJustice Major = "criminologyAndCriminalJustice" - CulturalAnthropology Major = "culturalAnthropology" - Cybersecurity Major = "cybersecurity" - DataScience Major = "dataScience" - Design Major = "design" - Economics Major = "economics" - ElectricalEngineering Major = "electricalEngineering" - English Major = "english" - EnvironmentalAndSustainabilityStudies Major = "environmentalAndSustainabilityStudies" - EnvironmentalEngineering Major = "environmentalEngineering" - EnvironmentalScience Major = "environmentalScience" - EnvironmentalStudies Major = "environmentalStudies" - GameArtAndAnimation Major = "gameArtAndAnimation" - GameDesign Major = "gameDesign" - GlobalAsianStudies Major = "globalAsianStudies" - HealthScience Major = "healthScience" - History Major = "history" - HistoryCultureAndLaw Major = "historyCultureAndLaw" - HumanServices Major = "humanServices" - IndustrialEngineering Major = "industrialEngineering" - InternationalAffairs Major = "internationalAffairs" - InternationalBusiness Major = "internationalBusiness" - InternationalBusinessAccounting Major = "internationalBusiness:Accounting" - InternationalBusinessAccountingAndAdvisoryServices Major = "internationalBusiness:AccountingAndAdvisoryServices" - InternationalBusinessBrandManagement Major = "internationalBusiness:BrandManagement" - InternationalBusinessBusinessAnalytics Major = "internationalBusiness:BusinessAnalytics" - InternationalBusinessCorporateInnovation Major = "internationalBusiness:CorporateInnovation" - InternationalBusinessEntrepreneurialStartups Major = "internationalBusiness:EntrepreneurialStartups" - InternationalBusinessFamilyBusiness Major = "internationalBusiness:FamilyBusiness" - InternationalBusinessFinance Major = "internationalBusiness:Finance" - InternationalBusinessFintech Major = "internationalBusiness:Fintech" - InternationalBusinessHealthcareManagementAndConsulting Major = "internationalBusiness:HealthcareManagementAndConsulting" - InternationalBusinessManagement Major = "internationalBusiness:Management" - InternationalBusinessManagementInformationSystems Major = "internationalBusiness:ManagementInformationSystems" - InternationalBusinessMarketing Major = "internationalBusiness:Marketing" - InternationalBusinessMarketingAnalytics Major = "internationalBusiness:MarketingAnalytics" - InternationalBusinessSocialInnovationAndEntrepreneurship Major = "internationalBusiness:SocialInnovationAndEntrepreneurship" - InternationalBusinessSupplyChainManagement Major = "internationalBusiness:SupplyChainManagement" - Journalism Major = "journalism" - LandscapeArchitecture Major = "landscapeArchitecture" - Linguistics Major = "linguistics" - MarineBiology Major = "marineBiology" - Mathematics Major = "mathematics" - MechanicalEngineering Major = "mechanicalEngineering" - MediaAndScreenStudies Major = "mediaAndScreenStudies" - MediaArts Major = "mediaArts" - Music Major = "music" - MusicTechnology Major = "musicTechnology" - Nursing Major = "nursing" - PharmaceuticalSciences Major = "pharmaceuticalSciences" - PharmacyPharmD Major = "pharmacy(PharmD)" - Philosophy Major = "philosophy" - Physics Major = "physics" - PoliticalScience Major = "politicalScience" - PoliticsPhilosophyEconomics Major = "politicsPhilosophyEconomics" - Psychology Major = "psychology" - PublicHealth Major = "publicHealth" - PublicRelations Major = "publicRelations" - ReligiousStudies Major = "religiousStudies" - Sociology Major = "sociology" - Spanish Major = "spanish" - SpeechLanguagePathologyAndAudiology Major = "speechLanguagePathologyAndAudiology" - Theatre Major = "theatre" -) - -type GraduationCycle string - -const ( - December GraduationCycle = "december" - May GraduationCycle = "may" -) - -type Tokens struct { - AccessToken string `json:"access_token"` - RefreshToken string `json:"refresh_token"` -} - type User struct { Model diff --git a/backend/entities/models/verification.go b/backend/entities/models/verification.go index 91a4fd217..77546ec05 100644 --- a/backend/entities/models/verification.go +++ b/backend/entities/models/verification.go @@ -19,18 +19,3 @@ type Verification struct { ExpiresAt time.Time `json:"expires_at"` Type VerificationType `json:"type"` } - -type VerifyEmailRequestBody struct { - Email string `json:"email" validate:"required,email"` - Token string `json:"token" validate:"required,len=6"` -} - -type VerifyPasswordResetTokenRequestBody struct { - Token string `json:"token" validate:"required"` - NewPassword string `json:"new_password" validate:"required,min=8,password"` - VerifyNewPassword string `json:"verify_new_password" validate:"required,min=8,password,eqfield=NewPassword"` -} - -type EmailRequestBody struct { - Email string `json:"email" validate:"required,email"` -} From 91603501eb431cec9066bfc8348abf4ecd32d29a Mon Sep 17 00:00:00 2001 From: Garrett Ladley <92384606+garrettladley@users.noreply.github.com> Date: Sat, 18 May 2024 12:37:26 -0400 Subject: [PATCH 16/28] update utilities.MergeMaps (#832) --- backend/utilities/map.go | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/backend/utilities/map.go b/backend/utilities/map.go index 756705977..653cc6182 100644 --- a/backend/utilities/map.go +++ b/backend/utilities/map.go @@ -1,11 +1,13 @@ package utilities +// MergeMaps merges multiple maps into a single map. +// The keys of maps earlier in the list will take precedence over keys in later maps. func MergeMaps[K comparable, V any](maps ...map[K]V) map[K]V { merged := make(map[K]V) - for _, m := range maps { - for key, value := range m { - merged[key] = value + for index := len(maps) - 1; index >= 0; index-- { + for k, v := range maps[index] { + merged[k] = v } } From 45e507f071b6034a283862bfe3e39436aa7360dc Mon Sep 17 00:00:00 2001 From: Garrett Ladley <92384606+garrettladley@users.noreply.github.com> Date: Sat, 18 May 2024 12:42:10 -0400 Subject: [PATCH 17/28] optimize utilities.Validate (#834) --- backend/utilities/validator.go | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/backend/utilities/validator.go b/backend/utilities/validator.go index c4b9add5c..21463fd35 100644 --- a/backend/utilities/validator.go +++ b/backend/utilities/validator.go @@ -116,10 +116,15 @@ func ValidateNonNegative(value string) (*int, error) { } func Validate(validate *validator.Validate, s any, maybeErrs ...MaybeError) error { - errors := make(map[string]string) + var errors map[string]string + hasErrors := false for _, maybeErr := range maybeErrs { if maybeErr.Err != nil { + if !hasErrors { + errors = make(map[string]string) + hasErrors = true + } errors[maybeErr.Name] = maybeErr.Err.Error() } } @@ -127,6 +132,10 @@ func Validate(validate *validator.Validate, s any, maybeErrs ...MaybeError) erro if err := validate.Struct(s); err != nil { validationErrs, ok := err.(validator.ValidationErrors) if ok { + if !hasErrors { + errors = make(map[string]string) + hasErrors = true + } for _, validationErr := range validationErrs { errors[ToSnakeCase(validationErr.Field())] = fmt.Sprintf("%s failed %s", validationErr.Field(), validationErr.Tag()) } @@ -135,7 +144,7 @@ func Validate(validate *validator.Validate, s any, maybeErrs ...MaybeError) erro } } - if len(errors) > 0 { + if hasErrors { return InvalidRequestData(errors) } From 91d78709215303afb351af667297fb2ed25f645d Mon Sep 17 00:00:00 2001 From: Garrett Ladley <92384606+garrettladley@users.noreply.github.com> Date: Sat, 18 May 2024 13:54:27 -0400 Subject: [PATCH 18/28] cleanup utilities.MaybeError (#836) --- backend/utilities/maybe_error.go | 8 ++++++++ backend/utilities/validator.go | 24 +++++++----------------- 2 files changed, 15 insertions(+), 17 deletions(-) diff --git a/backend/utilities/maybe_error.go b/backend/utilities/maybe_error.go index 5df2f933a..a71fcce6b 100644 --- a/backend/utilities/maybe_error.go +++ b/backend/utilities/maybe_error.go @@ -11,3 +11,11 @@ func NewMaybeError(name string, err error) *MaybeError { Err: err, } } + +func (me *MaybeError) Unwrap() error { + return me.Err +} + +func (me *MaybeError) IsError() bool { + return me.Err != nil +} diff --git a/backend/utilities/validator.go b/backend/utilities/validator.go index 21463fd35..22edbf8a9 100644 --- a/backend/utilities/validator.go +++ b/backend/utilities/validator.go @@ -3,7 +3,6 @@ package utilities import ( "fmt" "reflect" - "strconv" "strings" "github.com/GenerateNU/sac/backend/entities/models" @@ -105,39 +104,30 @@ func ValidateID(id string) (*uuid.UUID, error) { return &idAsUUID, nil } -func ValidateNonNegative(value string) (*int, error) { - valueAsInt, err := strconv.Atoi(value) - - if err != nil || valueAsInt < 0 { - return nil, fmt.Errorf("value must be a non-negative integer. got %s", value) - } - - return &valueAsInt, nil -} - func Validate(validate *validator.Validate, s any, maybeErrs ...MaybeError) error { - var errors map[string]string hasErrors := false + var maybeErrors map[string]string for _, maybeErr := range maybeErrs { if maybeErr.Err != nil { if !hasErrors { - errors = make(map[string]string) + maybeErrors = make(map[string]string) hasErrors = true } - errors[maybeErr.Name] = maybeErr.Err.Error() + maybeErrors[ToSnakeCase(maybeErr.Name)] = maybeErr.Err.Error() } } + var validationErrors map[string]string if err := validate.Struct(s); err != nil { validationErrs, ok := err.(validator.ValidationErrors) if ok { if !hasErrors { - errors = make(map[string]string) + validationErrors = make(map[string]string) hasErrors = true } for _, validationErr := range validationErrs { - errors[ToSnakeCase(validationErr.Field())] = fmt.Sprintf("%s failed %s", validationErr.Field(), validationErr.Tag()) + validationErrors[ToSnakeCase(validationErr.Field())] = fmt.Sprintf("%s failed %s", validationErr.Field(), validationErr.Tag()) } } else { return fmt.Errorf("failed to validate struct: %w", err) @@ -145,7 +135,7 @@ func Validate(validate *validator.Validate, s any, maybeErrs ...MaybeError) erro } if hasErrors { - return InvalidRequestData(errors) + return InvalidRequestData(MergeMaps(maybeErrors, validationErrors)) } return nil From 63d7bfd7adac78b2ced866114285914686123bf0 Mon Sep 17 00:00:00 2001 From: Garrett Ladley <92384606+garrettladley@users.noreply.github.com> Date: Sat, 18 May 2024 13:55:30 -0400 Subject: [PATCH 19/28] create issue templates (#837) --- .github/ISSUE_TEMPLATE/chore.md | 20 +++++++++++++++++ .github/ISSUE_TEMPLATE/feature-request.md | 20 +++++++++++++++++ .github/ISSUE_TEMPLATE/fix.md | 27 +++++++++++++++++++++++ 3 files changed, 67 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/chore.md create mode 100644 .github/ISSUE_TEMPLATE/feature-request.md create mode 100644 .github/ISSUE_TEMPLATE/fix.md diff --git a/.github/ISSUE_TEMPLATE/chore.md b/.github/ISSUE_TEMPLATE/chore.md new file mode 100644 index 000000000..830b91671 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/chore.md @@ -0,0 +1,20 @@ +--- +name: Chore +about: Something you'd like to see done but not urgently +title: chore +labels: chore +assignees: '' + +--- + +**Please describe.** +A clear and concise description of what you'd like to see. Ex. We should [...] + +**Describe the solution you'd like** +A clear and concise description of what you want to happen. + +**Describe alternatives you've considered** +A clear and concise description of any alternative solutions or features you've considered. + +**Additional context** +Add any other context or screenshots about the feature request here. diff --git a/.github/ISSUE_TEMPLATE/feature-request.md b/.github/ISSUE_TEMPLATE/feature-request.md new file mode 100644 index 000000000..052521ec5 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature-request.md @@ -0,0 +1,20 @@ +--- +name: Feature Request +about: Suggest an idea for this project +title: feat +labels: feature +assignees: '' + +--- + +**Is your feature request related to a problem? Please describe.** +A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] + +**Describe the solution you'd like** +A clear and concise description of what you want to happen. + +**Describe alternatives you've considered** +A clear and concise description of any alternative solutions or features you've considered. + +**Additional context** +Add any other context or screenshots about the feature request here. diff --git a/.github/ISSUE_TEMPLATE/fix.md b/.github/ISSUE_TEMPLATE/fix.md new file mode 100644 index 000000000..e66b00685 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/fix.md @@ -0,0 +1,27 @@ +--- +name: Fix +about: Create a report to help us improve +title: fix +labels: fix +assignees: '' + +--- + +**Describe the bug** +A clear and concise description of what the bug is. + +**To Reproduce** +Steps to reproduce the behavior: +1. Go to '...' +2. Click on '....' +3. Scroll down to '....' +4. See error + +**Expected behavior** +A clear and concise description of what you expected to happen. + +**Screenshots** +If applicable, add screenshots to help explain your problem. + +**Additional context** +Add any other context about the problem here. From 2caeddce1bfb0a15492ece8ac0f76e8ed4e5ba3a Mon Sep 17 00:00:00 2001 From: Garrett Ladley <92384606+garrettladley@users.noreply.github.com> Date: Sat, 18 May 2024 13:58:48 -0400 Subject: [PATCH 20/28] update issue templates (#839) --- .github/ISSUE_TEMPLATE/chore.md | 2 +- .github/ISSUE_TEMPLATE/feature-request.md | 2 +- .github/ISSUE_TEMPLATE/fix.md | 7 ++++--- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/chore.md b/.github/ISSUE_TEMPLATE/chore.md index 830b91671..f4fa8e43b 100644 --- a/.github/ISSUE_TEMPLATE/chore.md +++ b/.github/ISSUE_TEMPLATE/chore.md @@ -1,7 +1,7 @@ --- name: Chore about: Something you'd like to see done but not urgently -title: chore +title: chore: [Short description of the chore] labels: chore assignees: '' diff --git a/.github/ISSUE_TEMPLATE/feature-request.md b/.github/ISSUE_TEMPLATE/feature-request.md index 052521ec5..7b5660c4c 100644 --- a/.github/ISSUE_TEMPLATE/feature-request.md +++ b/.github/ISSUE_TEMPLATE/feature-request.md @@ -1,7 +1,7 @@ --- name: Feature Request about: Suggest an idea for this project -title: feat +title: feat: [Short description of the feature] labels: feature assignees: '' diff --git a/.github/ISSUE_TEMPLATE/fix.md b/.github/ISSUE_TEMPLATE/fix.md index e66b00685..7b1a6b3a9 100644 --- a/.github/ISSUE_TEMPLATE/fix.md +++ b/.github/ISSUE_TEMPLATE/fix.md @@ -1,7 +1,7 @@ --- name: Fix about: Create a report to help us improve -title: fix +title: fix: [Short description of the fix] labels: fix assignees: '' @@ -12,9 +12,10 @@ A clear and concise description of what the bug is. **To Reproduce** Steps to reproduce the behavior: + 1. Go to '...' -2. Click on '....' -3. Scroll down to '....' +2. Click on '...' +3. Scroll down to '...' 4. See error **Expected behavior** From 675cefc1205b41a823bd64caa8253bc46b339974 Mon Sep 17 00:00:00 2001 From: Garrett Ladley <92384606+garrettladley@users.noreply.github.com> Date: Sat, 18 May 2024 14:05:43 -0400 Subject: [PATCH 21/28] fix: issue templates (#841) --- .github/ISSUE_TEMPLATE/{fix.md => bug-report.md} | 8 +++----- .github/ISSUE_TEMPLATE/chore.md | 8 +++----- .github/ISSUE_TEMPLATE/feature-request.md | 8 +++----- 3 files changed, 9 insertions(+), 15 deletions(-) rename .github/ISSUE_TEMPLATE/{fix.md => bug-report.md} (81%) diff --git a/.github/ISSUE_TEMPLATE/fix.md b/.github/ISSUE_TEMPLATE/bug-report.md similarity index 81% rename from .github/ISSUE_TEMPLATE/fix.md rename to .github/ISSUE_TEMPLATE/bug-report.md index 7b1a6b3a9..f75073e9c 100644 --- a/.github/ISSUE_TEMPLATE/fix.md +++ b/.github/ISSUE_TEMPLATE/bug-report.md @@ -1,10 +1,8 @@ --- -name: Fix +name: "\U0001F41B Fix" about: Create a report to help us improve -title: fix: [Short description of the fix] -labels: fix -assignees: '' - +title: "\U0001F41B fix: [Short description of the fix]" +labels: ["\U0001F41B fix"] --- **Describe the bug** diff --git a/.github/ISSUE_TEMPLATE/chore.md b/.github/ISSUE_TEMPLATE/chore.md index f4fa8e43b..d498e5cb8 100644 --- a/.github/ISSUE_TEMPLATE/chore.md +++ b/.github/ISSUE_TEMPLATE/chore.md @@ -1,10 +1,8 @@ --- -name: Chore +name: "🧹 Chore" about: Something you'd like to see done but not urgently -title: chore: [Short description of the chore] -labels: chore -assignees: '' - +title: "🧹 chore: [Short description of the chore]" +labels: ["🧹 chore"] --- **Please describe.** diff --git a/.github/ISSUE_TEMPLATE/feature-request.md b/.github/ISSUE_TEMPLATE/feature-request.md index 7b5660c4c..c460abd38 100644 --- a/.github/ISSUE_TEMPLATE/feature-request.md +++ b/.github/ISSUE_TEMPLATE/feature-request.md @@ -1,10 +1,8 @@ --- -name: Feature Request +name: "📝 Feature Request" about: Suggest an idea for this project -title: feat: [Short description of the feature] -labels: feature -assignees: '' - +title: "📝 feat: [Short description of the feature]" +labels: ["📝 feature"] --- **Is your feature request related to a problem? Please describe.** From 981ae6fef41e6a9fda3d745c5d4060ad2ea6db0b Mon Sep 17 00:00:00 2001 From: Garrett Ladley <92384606+garrettladley@users.noreply.github.com> Date: Sat, 18 May 2024 14:08:06 -0400 Subject: [PATCH 22/28] fix bug report template (#842) --- .github/ISSUE_TEMPLATE/bug-report.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug-report.md b/.github/ISSUE_TEMPLATE/bug-report.md index f75073e9c..faf7d9089 100644 --- a/.github/ISSUE_TEMPLATE/bug-report.md +++ b/.github/ISSUE_TEMPLATE/bug-report.md @@ -1,8 +1,8 @@ --- -name: "\U0001F41B Fix" +name: "☢️ Bug" about: Create a report to help us improve -title: "\U0001F41B fix: [Short description of the fix]" -labels: ["\U0001F41B fix"] +title: "☢️ bug: [Short description of the bug]" +labels: ["☢️ bug"] --- **Describe the bug** From c8a944f9e1acede99285b168b00074cd56559caa Mon Sep 17 00:00:00 2001 From: Garrett Ladley <92384606+garrettladley@users.noreply.github.com> Date: Sat, 18 May 2024 14:44:18 -0400 Subject: [PATCH 23/28] feat: backend telemetry (#843) --- backend/go.mod | 9 ++++ backend/go.sum | 19 +++++++ backend/main.go | 96 ++++++++++++++++++++-------------- backend/server/server.go | 6 +++ backend/telemetry/README.md | 3 ++ backend/telemetry/telemetry.go | 48 +++++++++++++++++ go.work.sum | 8 ++- 7 files changed, 144 insertions(+), 45 deletions(-) create mode 100644 backend/telemetry/README.md create mode 100644 backend/telemetry/telemetry.go diff --git a/backend/go.mod b/backend/go.mod index cff7af345..19e721d77 100644 --- a/backend/go.mod +++ b/backend/go.mod @@ -40,11 +40,17 @@ require ( ) require ( + github.com/go-logr/logr v1.4.1 // indirect + github.com/go-logr/stdr v1.2.2 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-multierror v1.1.1 // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect github.com/lib/pq v1.10.9 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect + go.opentelemetry.io/contrib v1.17.0 // indirect + go.opentelemetry.io/otel/metric v1.26.0 // indirect + go.opentelemetry.io/otel/sdk v1.26.0 // indirect + go.opentelemetry.io/otel/trace v1.26.0 // indirect go.uber.org/atomic v1.11.0 // indirect ) @@ -61,6 +67,7 @@ require ( github.com/go-playground/locales v0.14.1 // indirect github.com/go-playground/universal-translator v0.18.1 // indirect github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 + github.com/gofiber/contrib/otelfiber v1.0.10 github.com/golang-migrate/migrate/v4 v4.17.1 github.com/hashicorp/hcl v1.0.0 // indirect github.com/jackc/pgpassfile v1.0.0 // indirect @@ -91,6 +98,8 @@ require ( github.com/valyala/bytebufferpool v1.0.0 // indirect github.com/valyala/fasthttp v1.52.0 // indirect github.com/valyala/tcplisten v1.0.0 // indirect + go.opentelemetry.io/otel v1.26.0 + go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.26.0 go.uber.org/multierr v1.11.0 // indirect golang.org/x/exp v0.0.0-20240404231335-c0f41cb1a7a0 // indirect golang.org/x/net v0.24.0 // indirect diff --git a/backend/go.sum b/backend/go.sum index dfa72fd5b..10869128a 100644 --- a/backend/go.sum +++ b/backend/go.sum @@ -40,6 +40,11 @@ github.com/garrettladley/fiberpaginate v1.0.1 h1:Ren6wx8L8KLcPvCKUkgRuaZaxX7CjCC github.com/garrettladley/fiberpaginate v1.0.1/go.mod h1:MHVWGQkhtnt2kE8F0wkTF5iUQOyqZlRktfcGgBLRBv0= github.com/garrettladley/mattress v0.4.0 h1:ZB3iqyc5q6bqIryNfsh2FMcbMdnV1XEryvqivouceQE= github.com/garrettladley/mattress v0.4.0/go.mod h1:OWKIRc9wC3gtD3Ng/nUuNEiR1TJvRYLmn/KZYw9nl5Q= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= +github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-openapi/jsonpointer v0.21.0 h1:YgdVicSA9vH5RiHs9TZW5oyafXZFc6+2Vc1rr/O9oNQ= github.com/go-openapi/jsonpointer v0.21.0/go.mod h1:IUyH9l/+uyhIYQ/PXVA41Rexl+kOkAPDdXEYns6fzUY= github.com/go-openapi/jsonreference v0.21.0 h1:Rs+Y7hSXT83Jacb7kFyjn4ijOuVGSvOdF2+tg1TRrwQ= @@ -60,6 +65,8 @@ github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsM github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/gofiber/contrib/otelfiber v1.0.10 h1:Bu28Pi4pfYmGfIc/9+sNaBbFwTHGY/zpSIK5jBxuRtM= +github.com/gofiber/contrib/otelfiber v1.0.10/go.mod h1:jN6AvS1HolDHTQHFURsV+7jSX96FpXYeKH6nmkq8AIw= github.com/gofiber/fiber/v2 v2.52.4 h1:P+T+4iK7VaqUsq2PALYEfBBo6bJZ4q3FP8cZ84EggTM= github.com/gofiber/fiber/v2 v2.52.4/go.mod h1:KEOE+cXMhXG0zHc9d8+E38hoX+ZN7bhOtgeF2oT6jrQ= github.com/gofiber/swagger v1.0.0 h1:BzUzDS9ZT6fDUa692kxmfOjc1DZiloLiPK/W5z1H1tc= @@ -209,6 +216,18 @@ github.com/valyala/fasthttp v1.52.0 h1:wqBQpxH71XW0e2g+Og4dzQM8pk34aFYlA1Ga8db7g github.com/valyala/fasthttp v1.52.0/go.mod h1:hf5C4QnVMkNXMspnsUlfM3WitlgYflyhHYoKol/szxQ= github.com/valyala/tcplisten v1.0.0 h1:rBHj/Xf+E1tRGZyWIWwJDiRY0zc1Js+CV5DqwacVSA8= github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc= +go.opentelemetry.io/contrib v1.17.0 h1:lJJdtuNsP++XHD7tXDYEFSpsqIc7DzShuXMR5PwkmzA= +go.opentelemetry.io/contrib v1.17.0/go.mod h1:gIzjwWFoGazJmtCaDgViqOSJPde2mCWzv60o0bWPcZs= +go.opentelemetry.io/otel v1.26.0 h1:LQwgL5s/1W7YiiRwxf03QGnWLb2HW4pLiAhaA5cZXBs= +go.opentelemetry.io/otel v1.26.0/go.mod h1:UmLkJHUAidDval2EICqBMbnAd0/m2vmpf/dAM+fvFs4= +go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.26.0 h1:0W5o9SzoR15ocYHEQfvfipzcNog1lBxOLfnex91Hk6s= +go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.26.0/go.mod h1:zVZ8nz+VSggWmnh6tTsJqXQ7rU4xLwRtna1M4x5jq58= +go.opentelemetry.io/otel/metric v1.26.0 h1:7S39CLuY5Jgg9CrnA9HHiEjGMF/X2VHvoXGgSllRz30= +go.opentelemetry.io/otel/metric v1.26.0/go.mod h1:SY+rHOI4cEawI9a7N1A4nIg/nTQXe1ccCNWYOJUrpX4= +go.opentelemetry.io/otel/sdk v1.26.0 h1:Y7bumHf5tAiDlRYFmGqetNcLaVUZmh4iYfmGxtmz7F8= +go.opentelemetry.io/otel/sdk v1.26.0/go.mod h1:0p8MXpqLeJ0pzcszQQN4F0S5FVjBLgypeGSngLsmirs= +go.opentelemetry.io/otel/trace v1.26.0 h1:1ieeAUb4y0TE26jUFrCIXKpTuVK7uJGN9/Z/2LP5sQA= +go.opentelemetry.io/otel/trace v1.26.0/go.mod h1:4iDxvGDQuUkHve82hJJ8UqrwswHYsZuWCBllGV2U2y0= go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= diff --git a/backend/main.go b/backend/main.go index 27d524daf..87113b713 100644 --- a/backend/main.go +++ b/backend/main.go @@ -1,8 +1,10 @@ package main import ( + "context" "flag" "fmt" + "log/slog" "net" "os" "path/filepath" @@ -15,42 +17,12 @@ import ( "github.com/GenerateNU/sac/backend/integrations/file" "github.com/GenerateNU/sac/backend/integrations/search" "github.com/GenerateNU/sac/backend/server" + "github.com/GenerateNU/sac/backend/telemetry" "github.com/GenerateNU/sac/backend/tests/api/mocks" + "go.opentelemetry.io/otel" ) -func CheckServerRunning(host string, port uint16) error { - address := fmt.Sprintf("%s:%d", host, port) - conn, err := net.Dial("tcp", address) - if err != nil { - return err - } - defer conn.Close() - return nil -} - -func Exit(format string, a ...interface{}) { - fmt.Fprintf(os.Stderr, format, a...) - os.Exit(0) -} - -func configureIntegrations(config *config.Settings, connectToPinecone bool) integrations.Integrations { - openAi := search.NewOpenAIClient(config.OpenAI) - var pinecone search.SearchClientInterface - - if connectToPinecone { - pinecone = search.NewPineconeClient(openAi, config.Pinecone) - } else { - pinecone = mocks.NewPineconeMockClient() - } - - integrations := integrations.Integrations{ - File: file.NewAWSProvider(config.AWS), - AI: openAi, - Email: email.NewResendClient(config.Resend, true), - Search: pinecone, - } - return integrations -} +var tracer = otel.Tracer("sac") func main() { onlyMigrate := flag.Bool("only-migrate", false, "Specify if you want to only perform the database migration") @@ -63,17 +35,17 @@ func main() { config, err := config.GetConfiguration(*configPath, *useDevDotEnv) if err != nil { - Exit("Error getting configuration: %s", err.Error()) + exit("Error getting configuration: %s", err.Error()) } - err = CheckServerRunning(config.Application.Host, config.Application.Port) + err = checkServerRunning(config.Application.Host, config.Application.Port) if err == nil { - Exit("A server is already running on %s:%d.\n", config.Application.Host, config.Application.Port) + exit("A server is already running on %s:%d.\n", config.Application.Host, config.Application.Port) } db, err := database.ConfigureDB(*config) if err != nil { - Exit("Error migrating database: %s", err.Error()) + exit("Error migrating database: %s", err.Error()) } if *onlyMigrate { @@ -86,22 +58,66 @@ func main() { err := pinecone.Seed(db) if err != nil { - Exit("Error seeding PineconeDB: %s\n", err.Error()) + exit("Error seeding PineconeDB: %s\n", err.Error()) } return } err = database.ConnPooling(db) if err != nil { - Exit("Error with connection pooling: %s", err.Error()) + exit("Error with connection pooling: %s", err.Error()) } integrations := configureIntegrations(config, *connectToPinecone) + tp := telemetry.InitTracer() + + slog.Info("appease linter since we aren't tracing anything yet", "tracer", tracer) + + defer func() { + if err := tp.Shutdown(context.Background()); err != nil { + slog.Error("error shutting down tracer", "error", err) + } + }() + app := server.Init(db, integrations, *config) err = app.Listen(fmt.Sprintf("%s:%d", config.Application.Host, config.Application.Port)) if err != nil { - Exit("Error starting server: %s", err.Error()) + exit("Error starting server: %s", err.Error()) } } + +func checkServerRunning(host string, port uint16) error { + address := fmt.Sprintf("%s:%d", host, port) + conn, err := net.Dial("tcp", address) + if err != nil { + return err + } + defer conn.Close() + return nil +} + +func exit(format string, a ...interface{}) { + fmt.Fprintf(os.Stderr, format, a...) + os.Exit(0) +} + +func configureIntegrations(config *config.Settings, connectToPinecone bool) integrations.Integrations { + openAi := search.NewOpenAIClient(config.OpenAI) + var pinecone search.SearchClientInterface + + if connectToPinecone { + pinecone = search.NewPineconeClient(openAi, config.Pinecone) + } else { + pinecone = mocks.NewPineconeMockClient() + } + + integrations := integrations.Integrations{ + File: file.NewAWSProvider(config.AWS), + AI: openAi, + Email: email.NewResendClient(config.Resend, true), + Search: pinecone, + } + return integrations +} diff --git a/backend/server/server.go b/backend/server/server.go index 54bb31e75..2c20e81c2 100644 --- a/backend/server/server.go +++ b/backend/server/server.go @@ -21,6 +21,7 @@ import ( "github.com/GenerateNU/sac/backend/types" "github.com/GenerateNU/sac/backend/utilities" + "github.com/gofiber/contrib/otelfiber" "github.com/gofiber/fiber/v2" "github.com/gofiber/fiber/v2/middleware/compress" "github.com/gofiber/fiber/v2/middleware/cors" @@ -95,13 +96,18 @@ func newFiberApp(appSettings config.ApplicationSettings) *fiber.App { AllowOrigins: fmt.Sprintf("http://%s:%d", appSettings.Host, appSettings.Port), AllowCredentials: true, })) + app.Use(requestid.New()) + app.Use(logger.New(logger.Config{ Format: "[${time}] ${ip}:${port} ${pid} ${locals:requestid} ${status} - ${latency} ${method} ${path}\n", })) + app.Use(compress.New(compress.Config{ Level: compress.LevelBestSpeed, })) + app.Use(otelfiber.Middleware()) + return app } diff --git a/backend/telemetry/README.md b/backend/telemetry/README.md new file mode 100644 index 000000000..db0a2ff9a --- /dev/null +++ b/backend/telemetry/README.md @@ -0,0 +1,3 @@ +# tracing + +See this [example](https://github.com/gofiber/contrib/blob/main/otelfiber/README.md) for how to instrument an endpoint. diff --git a/backend/telemetry/telemetry.go b/backend/telemetry/telemetry.go new file mode 100644 index 000000000..842bd0376 --- /dev/null +++ b/backend/telemetry/telemetry.go @@ -0,0 +1,48 @@ +package telemetry + +import ( + "fmt" + "log" + + "github.com/gofiber/fiber/v2" + "go.opentelemetry.io/otel/sdk/resource" + + "go.opentelemetry.io/otel" + stdout "go.opentelemetry.io/otel/exporters/stdout/stdouttrace" + + // uncomment the following line to use Jaeger + // "go.opentelemetry.io/otel/exporters/jaeger" + "github.com/gofiber/contrib/otelfiber" + "go.opentelemetry.io/otel/propagation" + sdktrace "go.opentelemetry.io/otel/sdk/trace" + semconv "go.opentelemetry.io/otel/semconv/v1.4.0" +) + +func InitTracer() *sdktrace.TracerProvider { + exporter, err := stdout.New(stdout.WithPrettyPrint()) + // uncomment the following line to use Jaeger + // exporter, err := jaeger.New(jaeger.WithCollectorEndpoint(jaeger.WithEndpoint("http://localhost:14268/api/traces"))) + if err != nil { + log.Fatal(err) + } + tp := sdktrace.NewTracerProvider( + sdktrace.WithSampler(sdktrace.AlwaysSample()), + sdktrace.WithBatcher(exporter), + sdktrace.WithResource( + resource.NewWithAttributes( + semconv.SchemaURL, + semconv.ServiceNameKey.String("sac-service"), + )), + ) + otel.SetTracerProvider(tp) + otel.SetTextMapPropagator(propagation.NewCompositeTextMapPropagator(propagation.TraceContext{}, propagation.Baggage{})) + return tp +} + +func Use(app *fiber.App) *fiber.App { + app.Use(otelfiber.Middleware(otelfiber.WithSpanNameFormatter(func(c *fiber.Ctx) string { + return fmt.Sprintf("%s - %s", c.Method(), c.Route().Path) + }))) + + return app +} diff --git a/go.work.sum b/go.work.sum index 989b274a0..11b05c648 100644 --- a/go.work.sum +++ b/go.work.sum @@ -198,8 +198,6 @@ github.com/form3tech-oss/jwt-go v3.2.5+incompatible/go.mod h1:pbq4aXjuKjdthFRnoD github.com/fsouza/fake-gcs-server v1.17.0/go.mod h1:D1rTE4YCyHFNa99oyJJ5HyclvN/0uQR+pM/VdlL83bw= github.com/gabriel-vasile/mimetype v1.4.2 h1:w5qFW6JKBz9Y393Y4q372O9A7cUSequkh1Q7OhCmWKU= github.com/gabriel-vasile/mimetype v1.4.2/go.mod h1:zApsH/mKG4w07erKIaJPFiX0Tsq9BFQgN3qGY5GnNgA= -github.com/garrettladley/fiberpaginate v1.0.1 h1:Ren6wx8L8KLcPvCKUkgRuaZaxX7CjCCoPhCUytnrGyk= -github.com/garrettladley/fiberpaginate v1.0.1/go.mod h1:MHVWGQkhtnt2kE8F0wkTF5iUQOyqZlRktfcGgBLRBv0= github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/gobuffalo/here v0.6.0/go.mod h1:wAG085dHOYqUpf+Ap+WOdrPTp5IYcDAs/x7PLa8Y5fM= @@ -262,10 +260,7 @@ github.com/klauspost/asmfmt v1.3.2/go.mod h1:AG8TuvYojzulgDAMCnYn50l/5QV3Bs/tp6j github.com/klauspost/compress v1.17.0/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= -github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pty v1.1.1 h1:VkoXIwSboBpnk99O/KFauAEILuNHv5DVFKZMBN/gUgw= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/ktrysmt/go-bitbucket v0.6.4/go.mod h1:9u0v3hsd2rqCHRIpbir1oP7F58uo5dq19sBYvuMoyQ4= github.com/lyft/protoc-gen-star/v2 v2.0.3/go.mod h1:amey7yeodaJhXSbf/TlLvWiqQfLOSpEk//mLlc+axEk= github.com/markbates/pkger v0.15.1/go.mod h1:0JoVlrol20BSywW79rN3kdFFsE5xYM+rSCQDXbLhiuI= @@ -339,6 +334,9 @@ go.lsp.dev/pkg v0.0.0-20210717090340-384b27a52fb2/go.mod h1:gtSHRuYfbCT0qnbLnovp go.lsp.dev/uri v0.3.0/go.mod h1:P5sbO1IQR+qySTWOCnhnK7phBx+W3zbLqSMDJNTw88I= go.mongodb.org/mongo-driver v1.7.5/go.mod h1:VXEWRZ6URJIkUq2SCAyapmhH0ZLRBP+FT4xhp5Zvxng= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= +go.opentelemetry.io/contrib/propagators/b3 v1.17.0/go.mod h1:IkfUfMpKWmynvvE0264trz0sf32NRTZL4nuAN9AbWRc= +go.opentelemetry.io/otel/oteltest v1.0.0-RC3/go.mod h1:xpzajI9JBRr7gX63nO6kAmImmYIAtuQblZ36Z+LfCjE= +go.opentelemetry.io/otel/sdk/metric v0.39.0/go.mod h1:piDIRgjcK7u0HCL5pCA4e74qpK/jk3NiUoAHATVAmiI= go.opentelemetry.io/proto/otlp v0.19.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/multierr v1.9.0/go.mod h1:X2jQV1h+kxSjClGpnseKVIxpmcjrj7MNnI0bnlfKTVQ= From 36e5eab0eded2bfc13e62073cf1e73734f3ad5d4 Mon Sep 17 00:00:00 2001 From: Garrett Ladley <92384606+garrettladley@users.noreply.github.com> Date: Sat, 18 May 2024 15:28:19 -0400 Subject: [PATCH 24/28] feat: move fiberparingate to service params & middleware cleanup (#846) --- backend/entities/categories/base/routes.go | 3 +- backend/entities/categories/tags/routes.go | 3 +- backend/entities/clubs/base/routes.go | 7 ++--- backend/entities/clubs/contacts/routes.go | 4 +-- backend/entities/clubs/events/routes.go | 3 +- backend/entities/clubs/followers/routes.go | 3 +- backend/entities/clubs/members/routes.go | 9 +++--- backend/entities/clubs/pocs/routes.go | 10 +++---- backend/entities/clubs/tags/routes.go | 6 ++-- backend/entities/contacts/base/routes.go | 3 +- backend/entities/events/base/routes.go | 7 ++--- backend/entities/events/series/routes.go | 8 +++--- backend/entities/events/tags/routes.go | 6 ++-- backend/entities/files/base/routes.go | 3 +- backend/entities/pocs/base/routes.go | 3 +- backend/entities/users/base/routes.go | 3 +- backend/middleware/{ => auth}/auth.go | 22 +------------- backend/middleware/{ => auth}/club.go | 2 +- backend/middleware/{ => auth}/event.go | 2 +- backend/middleware/{ => auth}/extractor.go | 2 +- backend/middleware/{ => auth}/middleware.go | 10 ++----- backend/middleware/{ => auth}/user.go | 2 +- backend/middleware/utility/limiter.go | 24 ++++++++++++++++ backend/middleware/utility/middleware.go | 22 ++++++++++++++ backend/middleware/utility/paginator.go | 9 ++++++ backend/server/server.go | 32 ++++++++++++--------- backend/types/params.go | 30 ++++++++++++++++--- 27 files changed, 142 insertions(+), 96 deletions(-) rename backend/middleware/{ => auth}/auth.go (78%) rename backend/middleware/{ => auth}/club.go (98%) rename backend/middleware/{ => auth}/event.go (98%) rename backend/middleware/{ => auth}/extractor.go (98%) rename backend/middleware/{ => auth}/middleware.go (63%) rename backend/middleware/{ => auth}/user.go (97%) create mode 100644 backend/middleware/utility/limiter.go create mode 100644 backend/middleware/utility/middleware.go create mode 100644 backend/middleware/utility/paginator.go diff --git a/backend/entities/categories/base/routes.go b/backend/entities/categories/base/routes.go index a171c0074..f41980ee0 100644 --- a/backend/entities/categories/base/routes.go +++ b/backend/entities/categories/base/routes.go @@ -4,7 +4,6 @@ import ( "github.com/GenerateNU/sac/backend/auth" "github.com/GenerateNU/sac/backend/entities/categories/tags" "github.com/GenerateNU/sac/backend/types" - "github.com/garrettladley/fiberpaginate" "github.com/gofiber/fiber/v2" ) @@ -24,7 +23,7 @@ func Category(categoryParams types.RouteParams) fiber.Router { categories := categoryParams.Router.Group("/categories") categories.Post("/", categoryParams.AuthMiddleware.Authorize(auth.CreateAll), categoryController.CreateCategory) - categories.Get("/", fiberpaginate.New(), categoryController.GetCategories) + categories.Get("/", categoryParams.UtilityMiddleware.Paginator, categoryController.GetCategories) // api/v1/categories/:categoryID/* categoryID := categories.Group("/:categoryID") diff --git a/backend/entities/categories/tags/routes.go b/backend/entities/categories/tags/routes.go index 816dcc9eb..f4a0d4cb4 100644 --- a/backend/entities/categories/tags/routes.go +++ b/backend/entities/categories/tags/routes.go @@ -2,7 +2,6 @@ package tags import ( "github.com/GenerateNU/sac/backend/types" - "github.com/garrettladley/fiberpaginate" ) func CategoryTag(categoryParams types.RouteParams) { @@ -11,6 +10,6 @@ func CategoryTag(categoryParams types.RouteParams) { // api/v1/categories/:categoryID/tags/* categoryTags := categoryParams.Router.Group("/tags") - categoryTags.Get("/", fiberpaginate.New(), categoryTagController.GetTagsByCategory) + categoryTags.Get("/", categoryParams.UtilityMiddleware.Paginator, categoryTagController.GetTagsByCategory) categoryTags.Get("/:tagID", categoryTagController.GetTagByCategory) } diff --git a/backend/entities/clubs/base/routes.go b/backend/entities/clubs/base/routes.go index 5d89fd9ee..7633698b2 100644 --- a/backend/entities/clubs/base/routes.go +++ b/backend/entities/clubs/base/routes.go @@ -8,8 +8,7 @@ import ( "github.com/GenerateNU/sac/backend/entities/clubs/members" "github.com/GenerateNU/sac/backend/entities/clubs/pocs" "github.com/GenerateNU/sac/backend/entities/clubs/tags" - "github.com/GenerateNU/sac/backend/middleware" - "github.com/garrettladley/fiberpaginate" + authMiddleware "github.com/GenerateNU/sac/backend/middleware/auth" "github.com/GenerateNU/sac/backend/types" "github.com/gofiber/fiber/v2" @@ -32,7 +31,7 @@ func ClubRouter(clubParams types.RouteParams) fiber.Router { // api/v1/clubs/* clubs := clubParams.Router.Group("/clubs") - clubs.Get("/", fiberpaginate.New(), clubController.GetClubs) + clubs.Get("/", clubParams.UtilityMiddleware.Paginator, clubController.GetClubs) clubs.Post("/", clubParams.AuthMiddleware.Authorize(p.CreateAll), clubController.CreateClub) // api/v1/clubs/:clubID/* @@ -41,7 +40,7 @@ func ClubRouter(clubParams types.RouteParams) fiber.Router { clubID.Get("/", clubController.GetClub) clubID.Patch( "/", - middleware.AttachExtractor(clubParams.AuthMiddleware.ClubAuthorizeById, middleware.ExtractFromParams("clubID")), + authMiddleware.AttachExtractor(clubParams.AuthMiddleware.ClubAuthorizeById, authMiddleware.ExtractFromParams("clubID")), clubController.UpdateClub, ) clubID.Delete("/", clubParams.AuthMiddleware.Authorize(p.DeleteAll), clubController.DeleteClub) diff --git a/backend/entities/clubs/contacts/routes.go b/backend/entities/clubs/contacts/routes.go index 358408bfb..252fcfe52 100644 --- a/backend/entities/clubs/contacts/routes.go +++ b/backend/entities/clubs/contacts/routes.go @@ -1,7 +1,7 @@ package contacts import ( - "github.com/GenerateNU/sac/backend/middleware" + authMiddleware "github.com/GenerateNU/sac/backend/middleware/auth" "github.com/GenerateNU/sac/backend/types" ) @@ -14,7 +14,7 @@ func ClubContact(clubParams types.RouteParams) { clubContacts.Get("/", clubContactController.GetClubContacts) clubContacts.Put( "/", - middleware.AttachExtractor(clubParams.AuthMiddleware.ClubAuthorizeById, middleware.ExtractFromParams("clubID")), + authMiddleware.AttachExtractor(clubParams.AuthMiddleware.ClubAuthorizeById, authMiddleware.ExtractFromParams("clubID")), clubContactController.PutContact, ) } diff --git a/backend/entities/clubs/events/routes.go b/backend/entities/clubs/events/routes.go index 4aefdf69a..1a0bd42dd 100644 --- a/backend/entities/clubs/events/routes.go +++ b/backend/entities/clubs/events/routes.go @@ -2,7 +2,6 @@ package events import ( "github.com/GenerateNU/sac/backend/types" - "github.com/garrettladley/fiberpaginate" ) func ClubEvent(clubParams types.RouteParams) { @@ -11,5 +10,5 @@ func ClubEvent(clubParams types.RouteParams) { // api/v1/clubs/:clubID/events/* events := clubParams.Router.Group("/events") - events.Get("/", fiberpaginate.New(), clubEventController.GetClubEvents) + events.Get("/", clubParams.UtilityMiddleware.Paginator, clubEventController.GetClubEvents) } diff --git a/backend/entities/clubs/followers/routes.go b/backend/entities/clubs/followers/routes.go index a67a4744e..81f9e3a61 100644 --- a/backend/entities/clubs/followers/routes.go +++ b/backend/entities/clubs/followers/routes.go @@ -2,7 +2,6 @@ package followers import ( "github.com/GenerateNU/sac/backend/types" - "github.com/garrettladley/fiberpaginate" ) func ClubFollower(clubParams types.RouteParams) { @@ -11,5 +10,5 @@ func ClubFollower(clubParams types.RouteParams) { clubFollowers := clubParams.Router.Group("/followers") // api/clubs/:clubID/followers/* - clubFollowers.Get("/", fiberpaginate.New(), clubFollowerController.GetClubFollowers) + clubFollowers.Get("/", clubParams.UtilityMiddleware.Paginator, clubFollowerController.GetClubFollowers) } diff --git a/backend/entities/clubs/members/routes.go b/backend/entities/clubs/members/routes.go index 891ec3a7d..660a83db8 100644 --- a/backend/entities/clubs/members/routes.go +++ b/backend/entities/clubs/members/routes.go @@ -1,9 +1,8 @@ package members import ( - "github.com/GenerateNU/sac/backend/middleware" + authMiddleware "github.com/GenerateNU/sac/backend/middleware/auth" "github.com/GenerateNU/sac/backend/types" - "github.com/garrettladley/fiberpaginate" ) func ClubMember(clubParams types.RouteParams) { @@ -12,15 +11,15 @@ func ClubMember(clubParams types.RouteParams) { clubMembers := clubParams.Router.Group("/members") // api/v1/clubs/:clubID/members/* - clubMembers.Get("/", fiberpaginate.New(), clubMemberController.GetClubMembers) + clubMembers.Get("/", clubParams.UtilityMiddleware.Paginator, clubMemberController.GetClubMembers) clubMembers.Post( "/:userID", - middleware.AttachExtractor(clubParams.AuthMiddleware.ClubAuthorizeById, middleware.ExtractFromParams("clubID")), + authMiddleware.AttachExtractor(clubParams.AuthMiddleware.ClubAuthorizeById, authMiddleware.ExtractFromParams("clubID")), clubMemberController.CreateClubMember, ) clubMembers.Delete( "/:userID", - middleware.AttachExtractor(clubParams.AuthMiddleware.ClubAuthorizeById, middleware.ExtractFromParams("clubID")), + authMiddleware.AttachExtractor(clubParams.AuthMiddleware.ClubAuthorizeById, authMiddleware.ExtractFromParams("clubID")), clubMemberController.DeleteClubMember, ) } diff --git a/backend/entities/clubs/pocs/routes.go b/backend/entities/clubs/pocs/routes.go index 55594beef..bd57f188c 100644 --- a/backend/entities/clubs/pocs/routes.go +++ b/backend/entities/clubs/pocs/routes.go @@ -1,7 +1,7 @@ package pocs import ( - "github.com/GenerateNU/sac/backend/middleware" + authMiddleware "github.com/GenerateNU/sac/backend/middleware/auth" "github.com/GenerateNU/sac/backend/types" ) @@ -15,22 +15,22 @@ func ClubPointOfContact(clubParams types.RouteParams) { clubPointOfContacts.Get("/:pocID", clubPointOfContactController.GetClubPointOfContact) clubPointOfContacts.Post( "/", - middleware.AttachExtractor(clubParams.AuthMiddleware.ClubAuthorizeById, middleware.ExtractFromParams("clubID")), + authMiddleware.AttachExtractor(clubParams.AuthMiddleware.ClubAuthorizeById, authMiddleware.ExtractFromParams("clubID")), clubPointOfContactController.CreateClubPointOfContact, ) clubPointOfContacts.Patch( "/:pocID", - middleware.AttachExtractor(clubParams.AuthMiddleware.ClubAuthorizeById, middleware.ExtractFromParams("clubID")), + authMiddleware.AttachExtractor(clubParams.AuthMiddleware.ClubAuthorizeById, authMiddleware.ExtractFromParams("clubID")), clubPointOfContactController.UpdateClubPointOfContact, ) clubPointOfContacts.Patch( "/:pocID/photo", - middleware.AttachExtractor(clubParams.AuthMiddleware.ClubAuthorizeById, middleware.ExtractFromParams("clubID")), + authMiddleware.AttachExtractor(clubParams.AuthMiddleware.ClubAuthorizeById, authMiddleware.ExtractFromParams("clubID")), clubPointOfContactController.UpdateClubPointOfContactPhoto, ) clubPointOfContacts.Delete( "/:pocID", - middleware.AttachExtractor(clubParams.AuthMiddleware.ClubAuthorizeById, middleware.ExtractFromParams("clubID")), + authMiddleware.AttachExtractor(clubParams.AuthMiddleware.ClubAuthorizeById, authMiddleware.ExtractFromParams("clubID")), clubPointOfContactController.DeleteClubPointOfContact, ) } diff --git a/backend/entities/clubs/tags/routes.go b/backend/entities/clubs/tags/routes.go index b3a5a140b..4384d1ee3 100644 --- a/backend/entities/clubs/tags/routes.go +++ b/backend/entities/clubs/tags/routes.go @@ -1,7 +1,7 @@ package tags import ( - "github.com/GenerateNU/sac/backend/middleware" + authMiddleware "github.com/GenerateNU/sac/backend/middleware/auth" "github.com/GenerateNU/sac/backend/types" ) @@ -14,12 +14,12 @@ func ClubTag(clubParams types.RouteParams) { clubTags.Get("/", clubTagController.GetClubTags) clubTags.Post( "/", - middleware.AttachExtractor(clubParams.AuthMiddleware.ClubAuthorizeById, middleware.ExtractFromParams("clubID")), + authMiddleware.AttachExtractor(clubParams.AuthMiddleware.ClubAuthorizeById, authMiddleware.ExtractFromParams("clubID")), clubTagController.CreateClubTags, ) clubTags.Delete( "/:tagID", - middleware.AttachExtractor(clubParams.AuthMiddleware.ClubAuthorizeById, middleware.ExtractFromParams("clubID")), + authMiddleware.AttachExtractor(clubParams.AuthMiddleware.ClubAuthorizeById, authMiddleware.ExtractFromParams("clubID")), clubTagController.DeleteClubTag, ) } diff --git a/backend/entities/contacts/base/routes.go b/backend/entities/contacts/base/routes.go index a68d7d15c..453705783 100644 --- a/backend/entities/contacts/base/routes.go +++ b/backend/entities/contacts/base/routes.go @@ -3,7 +3,6 @@ package base import ( "github.com/GenerateNU/sac/backend/auth" "github.com/GenerateNU/sac/backend/types" - "github.com/garrettladley/fiberpaginate" ) func Contact(contactParams types.RouteParams) { @@ -12,7 +11,7 @@ func Contact(contactParams types.RouteParams) { // api/v1/contacts/* contacts := contactParams.Router.Group("/contacts") - contacts.Get("/", fiberpaginate.New(), contactController.GetContacts) + contacts.Get("/", contactParams.UtilityMiddleware.Paginator, contactController.GetContacts) contacts.Get("/:contactID", contactController.GetContact) contacts.Delete("/:contactID", contactParams.AuthMiddleware.Authorize(auth.DeleteAll), contactController.DeleteContact) } diff --git a/backend/entities/events/base/routes.go b/backend/entities/events/base/routes.go index fa554a762..c0be2cb84 100644 --- a/backend/entities/events/base/routes.go +++ b/backend/entities/events/base/routes.go @@ -5,9 +5,8 @@ import ( "github.com/GenerateNU/sac/backend/entities/events/tags" "github.com/gofiber/fiber/v2" - "github.com/GenerateNU/sac/backend/middleware" + authMiddleware "github.com/GenerateNU/sac/backend/middleware/auth" "github.com/GenerateNU/sac/backend/types" - "github.com/garrettladley/fiberpaginate" ) func EventRoutes(eventParams types.RouteParams) { @@ -23,10 +22,10 @@ func EventRouter(eventParams types.RouteParams) fiber.Router { // api/v1/events/* events := eventParams.Router.Group("/events") - events.Get("/", fiberpaginate.New(), eventController.GetAllEvents) + events.Get("/", eventParams.UtilityMiddleware.Paginator, eventController.GetAllEvents) events.Post( "/", - middleware.AttachExtractor(eventParams.AuthMiddleware.ClubAuthorizeById, middleware.ExtractFromParams("clubID")), + authMiddleware.AttachExtractor(eventParams.AuthMiddleware.ClubAuthorizeById, authMiddleware.ExtractFromParams("clubID")), eventController.CreateEvent, ) diff --git a/backend/entities/events/series/routes.go b/backend/entities/events/series/routes.go index aaa97677d..b4310c2da 100644 --- a/backend/entities/events/series/routes.go +++ b/backend/entities/events/series/routes.go @@ -2,7 +2,7 @@ package series import ( "github.com/GenerateNU/sac/backend/extractors" - "github.com/GenerateNU/sac/backend/middleware" + authMiddleware "github.com/GenerateNU/sac/backend/middleware/auth" "github.com/GenerateNU/sac/backend/types" ) @@ -14,7 +14,7 @@ func EventSeries(eventParams types.RouteParams) { eventSeries.Post( "/", - middleware.AttachExtractor(eventParams.AuthMiddleware.ClubAuthorizeById, middleware.ExtractFromBody("host")), + authMiddleware.AttachExtractor(eventParams.AuthMiddleware.ClubAuthorizeById, authMiddleware.ExtractFromBody("host")), eventSeriesController.CreateEventSeries, ) @@ -23,9 +23,9 @@ func EventSeries(eventParams types.RouteParams) { eventSeriedID.Get("/", eventSeriesController.GetEventSeries) eventSeriedID.Delete( "/", - middleware.AttachExtractor( + authMiddleware.AttachExtractor( eventParams.AuthMiddleware.ClubAuthorizeById, - middleware.FromExtractFromParamIntoQuery("seriesID", eventParams.ServiceParams.DB, extractors.GetSeriesHost), + authMiddleware.FromExtractFromParamIntoQuery("seriesID", eventParams.ServiceParams.DB, extractors.GetSeriesHost), ), eventSeriesController.DeleteEventSeries, ) diff --git a/backend/entities/events/tags/routes.go b/backend/entities/events/tags/routes.go index 823647869..7ba3bb9c4 100644 --- a/backend/entities/events/tags/routes.go +++ b/backend/entities/events/tags/routes.go @@ -1,7 +1,7 @@ package tags import ( - "github.com/GenerateNU/sac/backend/middleware" + authMiddleware "github.com/GenerateNU/sac/backend/middleware/auth" "github.com/GenerateNU/sac/backend/types" ) @@ -13,12 +13,12 @@ func EventTags(eventParams types.RouteParams) { eventTags.Get("/", eventTagController.GetEventTags) eventTags.Post( "/", - middleware.AttachExtractor(eventParams.AuthMiddleware.EventAuthorizeById, middleware.ExtractFromParams("eventID")), + authMiddleware.AttachExtractor(eventParams.AuthMiddleware.EventAuthorizeById, authMiddleware.ExtractFromParams("eventID")), eventTagController.CreateEventTags, ) eventTags.Delete( "/:tagID", - middleware.AttachExtractor(eventParams.AuthMiddleware.EventAuthorizeById, middleware.ExtractFromParams("eventID")), + authMiddleware.AttachExtractor(eventParams.AuthMiddleware.EventAuthorizeById, authMiddleware.ExtractFromParams("eventID")), eventTagController.DeleteEventTag, ) } diff --git a/backend/entities/files/base/routes.go b/backend/entities/files/base/routes.go index 23d8baac4..c52205db5 100644 --- a/backend/entities/files/base/routes.go +++ b/backend/entities/files/base/routes.go @@ -2,7 +2,6 @@ package base import ( "github.com/GenerateNU/sac/backend/types" - "github.com/garrettladley/fiberpaginate" ) func File(fileParams types.RouteParams) { @@ -10,7 +9,7 @@ func File(fileParams types.RouteParams) { file := fileParams.Router.Group("/files") - file.Get("/", fiberpaginate.New(), fileController.GetFiles) + file.Get("/", fileParams.UtilityMiddleware.Paginator, fileController.GetFiles) file.Get("/:fileID", fileController.GetFile) file.Post("/", fileController.CreateFile) file.Delete("/:fileID", fileController.DeleteFile) diff --git a/backend/entities/pocs/base/routes.go b/backend/entities/pocs/base/routes.go index 9ec008cab..907459002 100644 --- a/backend/entities/pocs/base/routes.go +++ b/backend/entities/pocs/base/routes.go @@ -2,7 +2,6 @@ package base import ( "github.com/GenerateNU/sac/backend/types" - "github.com/garrettladley/fiberpaginate" ) func PointOfContact(pointOfContactParams types.RouteParams) { @@ -11,7 +10,7 @@ func PointOfContact(pointOfContactParams types.RouteParams) { // api/v1/pocs/* pointofContact := pointOfContactParams.Router.Group("/pocs") - pointofContact.Get("/", fiberpaginate.New(), pointOfContactController.GetPointOfContacts) + pointofContact.Get("/", pointOfContactParams.UtilityMiddleware.Paginator, pointOfContactController.GetPointOfContacts) pointofContact.Get("/:pocID", pointOfContactController.GetPointOfContact) // pointOfContact.Get("/:pocID/file", pointOfContactController.GetPointOfContacFileInfo)) } diff --git a/backend/entities/users/base/routes.go b/backend/entities/users/base/routes.go index 8c4753cf0..898a981ba 100644 --- a/backend/entities/users/base/routes.go +++ b/backend/entities/users/base/routes.go @@ -6,7 +6,6 @@ import ( "github.com/GenerateNU/sac/backend/entities/users/members" "github.com/GenerateNU/sac/backend/entities/users/tags" "github.com/GenerateNU/sac/backend/types" - "github.com/garrettladley/fiberpaginate" "github.com/gofiber/fiber/v2" ) @@ -27,7 +26,7 @@ func UsersRouter(userParams types.RouteParams) fiber.Router { // api/v1/users/* users := userParams.Router.Group("/users") - users.Get("/", userParams.AuthMiddleware.Authorize(p.ReadAll), fiberpaginate.New(), userController.GetUsers) + users.Get("/", userParams.AuthMiddleware.Authorize(p.ReadAll), userParams.UtilityMiddleware.Paginator, userController.GetUsers) users.Get("/me", userParams.AuthMiddleware.Authorize(p.UserRead), userController.GetMe) // api/v1/users/:userID/* diff --git a/backend/middleware/auth.go b/backend/middleware/auth/auth.go similarity index 78% rename from backend/middleware/auth.go rename to backend/middleware/auth/auth.go index 7538efdd3..1a0962766 100644 --- a/backend/middleware/auth.go +++ b/backend/middleware/auth/auth.go @@ -1,11 +1,8 @@ -package middleware +package auth import ( - "fmt" - "net/http" "slices" "strings" - "time" "github.com/GenerateNU/sac/backend/auth" "github.com/GenerateNU/sac/backend/utilities" @@ -15,7 +12,6 @@ import ( "github.com/golang-jwt/jwt" "github.com/gofiber/fiber/v2" - "github.com/gofiber/fiber/v2/middleware/limiter" ) func (m *AuthMiddlewareService) IsSuper(c *fiber.Ctx) bool { @@ -102,19 +98,3 @@ func (m *AuthMiddlewareService) Authorize(requiredPermissions ...auth.Permission return c.Next() } } - -// TODO: implement rate limiting with redis -func (m *AuthMiddlewareService) Limiter(rate int, expiration time.Duration) func(c *fiber.Ctx) error { - return limiter.New(limiter.Config{ - Max: rate, - Expiration: expiration, - KeyGenerator: func(c *fiber.Ctx) string { - return fmt.Sprintf("%s-%s", c.IP(), c.Path()) - }, - LimitReached: func(c *fiber.Ctx) error { - return c.Status(http.StatusTooManyRequests).JSON(fiber.Map{ - "error": "Too many requests", - }) - }, - }) -} diff --git a/backend/middleware/club.go b/backend/middleware/auth/club.go similarity index 98% rename from backend/middleware/club.go rename to backend/middleware/auth/club.go index 4c9560696..5a084fd7b 100644 --- a/backend/middleware/club.go +++ b/backend/middleware/auth/club.go @@ -1,4 +1,4 @@ -package middleware +package auth import ( "slices" diff --git a/backend/middleware/event.go b/backend/middleware/auth/event.go similarity index 98% rename from backend/middleware/event.go rename to backend/middleware/auth/event.go index b8a371fa5..542f6e7c2 100644 --- a/backend/middleware/event.go +++ b/backend/middleware/auth/event.go @@ -1,4 +1,4 @@ -package middleware +package auth import ( "slices" diff --git a/backend/middleware/extractor.go b/backend/middleware/auth/extractor.go similarity index 98% rename from backend/middleware/extractor.go rename to backend/middleware/auth/extractor.go index a9b4bcc37..8b10c29f5 100644 --- a/backend/middleware/extractor.go +++ b/backend/middleware/auth/extractor.go @@ -1,4 +1,4 @@ -package middleware +package auth import ( "errors" diff --git a/backend/middleware/middleware.go b/backend/middleware/auth/middleware.go similarity index 63% rename from backend/middleware/middleware.go rename to backend/middleware/auth/middleware.go index 5d3e6aabe..97b3cafa5 100644 --- a/backend/middleware/middleware.go +++ b/backend/middleware/auth/middleware.go @@ -1,8 +1,6 @@ -package middleware +package auth import ( - "time" - "github.com/GenerateNU/sac/backend/auth" "github.com/GenerateNU/sac/backend/config" "github.com/go-playground/validator/v10" @@ -14,10 +12,8 @@ type AuthMiddlewareInterface interface { ClubAuthorizeById(c *fiber.Ctx) error UserAuthorizeById(c *fiber.Ctx) error Authenticate(c *fiber.Ctx) error - Authorize(requiredPermissions ...auth.Permission) func(c *fiber.Ctx) error - Skip(h fiber.Handler) fiber.Handler + Authorize(requiredPermissions ...auth.Permission) fiber.Handler IsSuper(c *fiber.Ctx) bool - Limiter(rate int, duration time.Duration) func(c *fiber.Ctx) error } type AuthMiddlewareService struct { @@ -26,7 +22,7 @@ type AuthMiddlewareService struct { Auth config.AuthSettings } -func NewAuthMiddlewareService(db *gorm.DB, validate *validator.Validate, authSettings config.AuthSettings) *AuthMiddlewareService { +func New(db *gorm.DB, validate *validator.Validate, authSettings config.AuthSettings) *AuthMiddlewareService { return &AuthMiddlewareService{ DB: db, Validate: validate, diff --git a/backend/middleware/user.go b/backend/middleware/auth/user.go similarity index 97% rename from backend/middleware/user.go rename to backend/middleware/auth/user.go index 62b040bd9..bf489faa2 100644 --- a/backend/middleware/user.go +++ b/backend/middleware/auth/user.go @@ -1,4 +1,4 @@ -package middleware +package auth import ( "github.com/GenerateNU/sac/backend/auth" diff --git a/backend/middleware/utility/limiter.go b/backend/middleware/utility/limiter.go new file mode 100644 index 000000000..dc6ed2887 --- /dev/null +++ b/backend/middleware/utility/limiter.go @@ -0,0 +1,24 @@ +package utility + +import ( + "errors" + "fmt" + "time" + + "github.com/GenerateNU/sac/backend/utilities" + "github.com/gofiber/fiber/v2" + "github.com/gofiber/fiber/v2/middleware/limiter" +) + +func (u *UtilityMiddlewareService) Limiter(rate int, expiration time.Duration) func(c *fiber.Ctx) error { + return limiter.New(limiter.Config{ + Max: rate, + Expiration: expiration, + KeyGenerator: func(c *fiber.Ctx) string { + return fmt.Sprintf("%s-%s", c.IP(), c.Path()) + }, + LimitReached: func(c *fiber.Ctx) error { + return utilities.NewAPIError(fiber.StatusTooManyRequests, errors.New("too many requests")) + }, + }) +} diff --git a/backend/middleware/utility/middleware.go b/backend/middleware/utility/middleware.go new file mode 100644 index 000000000..cd940ea93 --- /dev/null +++ b/backend/middleware/utility/middleware.go @@ -0,0 +1,22 @@ +package utility + +import ( + "time" + + "github.com/gofiber/fiber/v2" +) + +type UtilityMiddlewareInterface interface { + Paginator(c *fiber.Ctx) error + Limiter(rate int, duration time.Duration) fiber.Handler +} + +type UtilityMiddlewareService struct { + paginator fiber.Handler +} + +func New(paginator fiber.Handler) *UtilityMiddlewareService { + return &UtilityMiddlewareService{ + paginator: paginator, + } +} diff --git a/backend/middleware/utility/paginator.go b/backend/middleware/utility/paginator.go new file mode 100644 index 000000000..0e2827fda --- /dev/null +++ b/backend/middleware/utility/paginator.go @@ -0,0 +1,9 @@ +package utility + +import ( + "github.com/gofiber/fiber/v2" +) + +func (u *UtilityMiddlewareService) Paginator(c *fiber.Ctx) error { + return u.paginator(c) +} diff --git a/backend/server/server.go b/backend/server/server.go index 2c20e81c2..fcd95b3d6 100644 --- a/backend/server/server.go +++ b/backend/server/server.go @@ -3,6 +3,7 @@ package server import ( "fmt" + "github.com/garrettladley/fiberpaginate" go_json "github.com/goccy/go-json" authenticator "github.com/GenerateNU/sac/backend/auth" @@ -17,7 +18,8 @@ import ( tags "github.com/GenerateNU/sac/backend/entities/tags/base" users "github.com/GenerateNU/sac/backend/entities/users/base" "github.com/GenerateNU/sac/backend/integrations" - "github.com/GenerateNU/sac/backend/middleware" + authMiddleware "github.com/GenerateNU/sac/backend/middleware/auth" + utilityMiddleware "github.com/GenerateNU/sac/backend/middleware/utility" "github.com/GenerateNU/sac/backend/types" "github.com/GenerateNU/sac/backend/utilities" @@ -50,22 +52,24 @@ func Init(db *gorm.DB, integrations integrations.Integrations, settings config.S } jwt := authenticator.NewJWTClient(settings.Auth, jwt.SigningMethodHS256) - authMiddleware := middleware.NewAuthMiddlewareService(db, validate, settings.Auth) + authMiddleware := authMiddleware.New(db, validate, settings.Auth) + utilityMiddleware := utilityMiddleware.New(fiberpaginate.New()) apiv1 := app.Group("/api/v1") - routeParams := types.RouteParams{ - Router: apiv1, - AuthMiddleware: authMiddleware, - ServiceParams: types.ServiceParams{ - DB: db, - Validate: validate, - Auth: &settings.Auth, - JWT: jwt, - Integrations: integrations, - Calendar: &settings.Calendar, - }, - } + routeParams := types.NewRouteParams( + apiv1, + authMiddleware, + utilityMiddleware, + types.NewServiceParams( + db, + validate, + &settings.Auth, + jwt, + &settings.Calendar, + integrations, + ), + ) allRoutes(app, routeParams) diff --git a/backend/types/params.go b/backend/types/params.go index 6f4551524..47a65a348 100644 --- a/backend/types/params.go +++ b/backend/types/params.go @@ -4,16 +4,27 @@ import ( "github.com/GenerateNU/sac/backend/auth" "github.com/GenerateNU/sac/backend/config" "github.com/GenerateNU/sac/backend/integrations" - "github.com/GenerateNU/sac/backend/middleware" + authMiddleware "github.com/GenerateNU/sac/backend/middleware/auth" + utilityMiddleware "github.com/GenerateNU/sac/backend/middleware/utility" "github.com/go-playground/validator/v10" "github.com/gofiber/fiber/v2" "gorm.io/gorm" ) type RouteParams struct { - Router fiber.Router - AuthMiddleware *middleware.AuthMiddlewareService - ServiceParams ServiceParams + Router fiber.Router + AuthMiddleware *authMiddleware.AuthMiddlewareService + UtilityMiddleware *utilityMiddleware.UtilityMiddlewareService + ServiceParams ServiceParams +} + +func NewRouteParams(router fiber.Router, authMiddleware *authMiddleware.AuthMiddlewareService, utilityMiddleware *utilityMiddleware.UtilityMiddlewareService, serviceParams ServiceParams) RouteParams { + return RouteParams{ + Router: router, + AuthMiddleware: authMiddleware, + UtilityMiddleware: utilityMiddleware, + ServiceParams: serviceParams, + } } type ServiceParams struct { @@ -24,3 +35,14 @@ type ServiceParams struct { Calendar *config.CalendarSettings Integrations integrations.Integrations } + +func NewServiceParams(db *gorm.DB, validate *validator.Validate, auth *config.AuthSettings, jwt auth.JWTClientInterface, calendar *config.CalendarSettings, integrations integrations.Integrations) ServiceParams { + return ServiceParams{ + DB: db, + Validate: validate, + Auth: auth, + JWT: jwt, + Calendar: calendar, + Integrations: integrations, + } +} From 61f1d8aef2b767c4ada34558b6df1ecff980c423 Mon Sep 17 00:00:00 2001 From: David Oduneye <44040421+DOOduneye@users.noreply.github.com> Date: Sun, 19 May 2024 16:23:24 -0400 Subject: [PATCH 25/28] fix: allows Authorization Bearer to be accessed in a node env (#852) --- backend/go.mod | 2 +- backend/go.sum | 6 ++++++ backend/server/server.go | 3 +++ 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/backend/go.mod b/backend/go.mod index 19e721d77..f3312a02b 100644 --- a/backend/go.mod +++ b/backend/go.mod @@ -22,6 +22,7 @@ require ( github.com/sahilm/fuzzy v0.1.1 github.com/spf13/viper v1.18.2 github.com/swaggo/swag v1.16.3 + go.opentelemetry.io/otel/sdk v1.26.0 golang.org/x/crypto v0.23.0 golang.org/x/text v0.15.0 gorm.io/driver/postgres v1.5.7 @@ -49,7 +50,6 @@ require ( github.com/mitchellh/mapstructure v1.5.0 // indirect go.opentelemetry.io/contrib v1.17.0 // indirect go.opentelemetry.io/otel/metric v1.26.0 // indirect - go.opentelemetry.io/otel/sdk v1.26.0 // indirect go.opentelemetry.io/otel/trace v1.26.0 // indirect go.uber.org/atomic v1.11.0 // indirect ) diff --git a/backend/go.sum b/backend/go.sum index 10869128a..34077d18d 100644 --- a/backend/go.sum +++ b/backend/go.sum @@ -218,14 +218,20 @@ github.com/valyala/tcplisten v1.0.0 h1:rBHj/Xf+E1tRGZyWIWwJDiRY0zc1Js+CV5DqwacVS github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc= go.opentelemetry.io/contrib v1.17.0 h1:lJJdtuNsP++XHD7tXDYEFSpsqIc7DzShuXMR5PwkmzA= go.opentelemetry.io/contrib v1.17.0/go.mod h1:gIzjwWFoGazJmtCaDgViqOSJPde2mCWzv60o0bWPcZs= +go.opentelemetry.io/contrib/propagators/b3 v1.17.0 h1:ImOVvHnku8jijXqkwCSyYKRDt2YrnGXD4BbhcpfbfJo= +go.opentelemetry.io/contrib/propagators/b3 v1.17.0/go.mod h1:IkfUfMpKWmynvvE0264trz0sf32NRTZL4nuAN9AbWRc= go.opentelemetry.io/otel v1.26.0 h1:LQwgL5s/1W7YiiRwxf03QGnWLb2HW4pLiAhaA5cZXBs= go.opentelemetry.io/otel v1.26.0/go.mod h1:UmLkJHUAidDval2EICqBMbnAd0/m2vmpf/dAM+fvFs4= go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.26.0 h1:0W5o9SzoR15ocYHEQfvfipzcNog1lBxOLfnex91Hk6s= go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.26.0/go.mod h1:zVZ8nz+VSggWmnh6tTsJqXQ7rU4xLwRtna1M4x5jq58= go.opentelemetry.io/otel/metric v1.26.0 h1:7S39CLuY5Jgg9CrnA9HHiEjGMF/X2VHvoXGgSllRz30= go.opentelemetry.io/otel/metric v1.26.0/go.mod h1:SY+rHOI4cEawI9a7N1A4nIg/nTQXe1ccCNWYOJUrpX4= +go.opentelemetry.io/otel/oteltest v1.0.0-RC3 h1:MjaeegZTaX0Bv9uB9CrdVjOFM/8slRjReoWoV9xDCpY= +go.opentelemetry.io/otel/oteltest v1.0.0-RC3/go.mod h1:xpzajI9JBRr7gX63nO6kAmImmYIAtuQblZ36Z+LfCjE= go.opentelemetry.io/otel/sdk v1.26.0 h1:Y7bumHf5tAiDlRYFmGqetNcLaVUZmh4iYfmGxtmz7F8= go.opentelemetry.io/otel/sdk v1.26.0/go.mod h1:0p8MXpqLeJ0pzcszQQN4F0S5FVjBLgypeGSngLsmirs= +go.opentelemetry.io/otel/sdk/metric v0.39.0 h1:Kun8i1eYf48kHH83RucG93ffz0zGV1sh46FAScOTuDI= +go.opentelemetry.io/otel/sdk/metric v0.39.0/go.mod h1:piDIRgjcK7u0HCL5pCA4e74qpK/jk3NiUoAHATVAmiI= go.opentelemetry.io/otel/trace v1.26.0 h1:1ieeAUb4y0TE26jUFrCIXKpTuVK7uJGN9/Z/2LP5sQA= go.opentelemetry.io/otel/trace v1.26.0/go.mod h1:4iDxvGDQuUkHve82hJJ8UqrwswHYsZuWCBllGV2U2y0= go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= diff --git a/backend/server/server.go b/backend/server/server.go index fcd95b3d6..ebb1e8ac7 100644 --- a/backend/server/server.go +++ b/backend/server/server.go @@ -99,6 +99,9 @@ func newFiberApp(appSettings config.ApplicationSettings) *fiber.App { app.Use(cors.New(cors.Config{ AllowOrigins: fmt.Sprintf("http://%s:%d", appSettings.Host, appSettings.Port), AllowCredentials: true, + AllowHeaders: "Origin, Content-Type, Accept, Authorization", + AllowMethods: "GET, POST, PUT, DELETE, OPTIONS", + ExposeHeaders: "Authorization, Content-Length, Content-Type", })) app.Use(requestid.New()) From d27d776785ecb0876a7d11a856a5abe56a9beaf9 Mon Sep 17 00:00:00 2001 From: David Oduneye <44040421+DOOduneye@users.noreply.github.com> Date: Sun, 19 May 2024 16:45:06 -0400 Subject: [PATCH 26/28] fix: refresh checks the cookies over request body (#853) --- backend/entities/auth/base/controller.go | 8 ++++---- backend/entities/auth/base/models.go | 4 ++++ 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/backend/entities/auth/base/controller.go b/backend/entities/auth/base/controller.go index cb29fe93d..48396131e 100644 --- a/backend/entities/auth/base/controller.go +++ b/backend/entities/auth/base/controller.go @@ -88,8 +88,8 @@ func (a *AuthController) Register(c *fiber.Ctx) error { // Refresh godoc // -// @Summary Refreshes a user's access token -// @Description Refreshes a user's access token +// @Summary Refreshes a user's access token and returns a new pair of tokens +// @Description Refreshes a user's access token and returns a new pair of tokens // @ID refresh-user // @Tags auth // @Accept json @@ -100,9 +100,9 @@ func (a *AuthController) Register(c *fiber.Ctx) error { // @Failure 500 {object} error // @Router /auth/refresh [post] func (a *AuthController) Refresh(c *fiber.Ctx) error { - var refreshBody authEntities.RefreshTokenRequestBody + var refreshBody RefreshTokenCookieBody - if err := c.BodyParser(&refreshBody); err != nil { + if err := c.CookieParser(&refreshBody); err != nil { return utilities.InvalidJSON() } diff --git a/backend/entities/auth/base/models.go b/backend/entities/auth/base/models.go index 32f759f57..a15a48349 100644 --- a/backend/entities/auth/base/models.go +++ b/backend/entities/auth/base/models.go @@ -14,3 +14,7 @@ type VerifyPasswordResetTokenRequestBody struct { type EmailRequestBody struct { Email string `json:"email" validate:"required,email"` } + +type RefreshTokenCookieBody struct { + RefreshToken string `cookie:"refresh_token" validate:"required"` +} From 774f9e5ad77d1cc2374138c2d2b72cafb8686158 Mon Sep 17 00:00:00 2001 From: Garrett Ladley <92384606+garrettladley@users.noreply.github.com> Date: Sun, 19 May 2024 20:33:31 -0400 Subject: [PATCH 27/28] fix: update refresh error (#856) --- backend/entities/auth/base/controller.go | 2 +- backend/utilities/api_error.go | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/backend/entities/auth/base/controller.go b/backend/entities/auth/base/controller.go index 48396131e..0b2189416 100644 --- a/backend/entities/auth/base/controller.go +++ b/backend/entities/auth/base/controller.go @@ -103,7 +103,7 @@ func (a *AuthController) Refresh(c *fiber.Ctx) error { var refreshBody RefreshTokenCookieBody if err := c.CookieParser(&refreshBody); err != nil { - return utilities.InvalidJSON() + return utilities.InvalidCookies() } tokens, err := a.authService.Refresh(refreshBody.RefreshToken) diff --git a/backend/utilities/api_error.go b/backend/utilities/api_error.go index 7600ff9c3..f4ecc154e 100644 --- a/backend/utilities/api_error.go +++ b/backend/utilities/api_error.go @@ -58,6 +58,10 @@ func InvalidJSON() APIError { return NewAPIError(http.StatusBadRequest, fmt.Errorf("invalid JSON request data")) } +func InvalidCookies() APIError { + return NewAPIError(http.StatusBadRequest, fmt.Errorf("invalid cookies")) +} + func Unauthorized() APIError { return NewAPIError(http.StatusUnauthorized, fmt.Errorf("unauthorized")) } From 21ae8540c17328b56e0bcfa44cc5fb89775cb67e Mon Sep 17 00:00:00 2001 From: Garrett Ladley <92384606+garrettladley@users.noreply.github.com> Date: Sun, 19 May 2024 21:05:44 -0400 Subject: [PATCH 28/28] fix: update cli test commands (#857) --- cli/cmd/test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cli/cmd/test.go b/cli/cmd/test.go index ccf2d5b52..91a8c1f64 100644 --- a/cli/cmd/test.go +++ b/cli/cmd/test.go @@ -100,7 +100,7 @@ var testBackendCmd = &cobra.Command{ Run: func(cmd *cobra.Command, args []string) { clear, _ := cmd.Flags().GetBool("clean") - err := helpers.Execute(exec.Command("go", "test", "./..."), helpers.BACKEND_DIR) + err := helpers.Execute(exec.Command("go", "test", "-v", "-race", "./..."), helpers.BACKEND_DIR) if err != nil { fmt.Println(err) } @@ -120,7 +120,7 @@ var testCliCmd = &cobra.Command{ Short: "CLI testing commands", Args: cobra.NoArgs, Run: func(cmd *cobra.Command, args []string) { - err := helpers.Execute(exec.Command("go", "test", "./..."), helpers.CLI_DIR) + err := helpers.Execute(exec.Command("go", "test", "-v", "-race", "./..."), helpers.CLI_DIR) if err != nil { fmt.Println(err) os.Exit(1)