├── .dockerignore ├── .editorconfig ├── .env.example ├── .eslintignore ├── .eslintrc.json ├── .github ├── ISSUE_TEMPLATE │ └── BUG-FORM.yml ├── combine-prs.yml ├── pull_request_template.md └── workflows │ ├── cd-supabase-deploy-migrations.yml │ ├── ci-supabase-migrations.yml │ └── ci.yml ├── .gitignore ├── .husky └── pre-commit ├── .kodiak.toml ├── .nvmrc ├── .pre-commit-config.yaml ├── .prettierignore ├── .prettierrc ├── .storybook ├── main.ts └── tsconfig.json ├── .vscode ├── extensions.json └── settings.json ├── CHANGELOG.md ├── CODEOWNERS ├── LICENSE ├── README.md ├── apps ├── .gitkeep ├── airplane │ ├── airplane.yaml │ ├── project.json │ ├── tasks │ │ ├── get_2023_hackers.py │ │ ├── get_2023_hackers.task.yaml │ │ └── requirements.txt │ └── tsconfig.json ├── auth-svc │ └── dist │ │ ├── app.test.js │ │ └── main.js ├── battlepass-api │ ├── .flake8 │ ├── .gitignore │ ├── CHANGELOG.md │ ├── README.md │ ├── battlepass_api │ │ ├── __init__.py │ │ ├── app.py │ │ └── leaderboard.py │ ├── configs │ │ ├── env.local.yml │ │ ├── env.prod.yml │ │ └── env.staging.yml │ ├── poetry.lock │ ├── poetry.toml │ ├── project.json │ ├── pyproject.toml │ ├── serverless.yml │ ├── tests │ │ ├── __init__.py │ │ ├── conftest.py │ │ └── test_index.py │ └── tox.ini ├── battlepass-service │ ├── .dev.vars.example │ ├── .gitignore │ ├── README.md │ ├── jest.config.ts │ ├── project.json │ ├── src │ │ └── index.ts │ ├── tsconfig.json │ ├── tsconfig.spec.json │ └── wrangler.toml ├── battlepass-services │ ├── .eslintrc.json │ ├── Dockerfile │ ├── jest.config.ts │ ├── project.json │ ├── src │ │ ├── app │ │ │ ├── .gitkeep │ │ │ └── index.ts │ │ ├── assets │ │ │ └── .gitkeep │ │ ├── controller │ │ │ ├── bonusPoints.controller.ts │ │ │ ├── leaderboard.controller.ts │ │ │ └── user.controller.ts │ │ ├── environments │ │ │ ├── environment.prod.ts │ │ │ └── environment.ts │ │ ├── main.ts │ │ ├── repository │ │ │ ├── bonusPoints.repository.ts │ │ │ ├── leaderboard.repository.ts │ │ │ └── user.repository.ts │ │ └── routers │ │ │ ├── bonusPoints.router.ts │ │ │ ├── leaderboard.router.ts │ │ │ └── user.router.ts │ ├── tsconfig.app.json │ ├── tsconfig.json │ └── tsconfig.spec.json ├── dashboard-e2e │ ├── .eslintrc.json │ ├── cypress.config.ts │ ├── project.json │ ├── src │ │ ├── e2e │ │ │ ├── QuestionCreator │ │ │ │ └── QuestionCreator.cy.ts │ │ │ ├── check-in │ │ │ │ └── check-in.cy.ts │ │ │ ├── gray-content-box │ │ │ │ └── gray-content-box.cy.ts │ │ │ ├── hacker-manager │ │ │ │ └── hacker-manager.cy.ts │ │ │ ├── hackform-backnext-widget │ │ │ │ └── hackform-backnext-widget.cy.ts │ │ │ ├── hackform-end │ │ │ │ └── hackform-end.cy.ts │ │ │ ├── hackform-introduction │ │ │ │ └── hackform-introduction.cy.ts │ │ │ ├── hackform-question-header │ │ │ │ └── hackform-question-header.cy.ts │ │ │ ├── hackform-question │ │ │ │ └── hackform-question.cy.ts │ │ │ ├── hackform │ │ │ │ └── hackform.cy.ts │ │ │ ├── long-text-input │ │ │ │ └── long-text-input.cy.ts │ │ │ ├── navbar │ │ │ │ └── navbar.cy.ts │ │ │ ├── pointr │ │ │ │ └── pointr.cy.ts │ │ │ ├── portal-menu │ │ │ │ └── portal-menu.cy.ts │ │ │ ├── searchable-options-input │ │ │ │ └── searchable-options-input.cy.ts │ │ │ ├── short-text-input │ │ │ │ └── short-text-input.cy.ts │ │ │ └── top-bar │ │ │ │ └── top-bar.cy.ts │ │ ├── fixtures │ │ │ └── example.json │ │ └── support │ │ │ ├── commands.ts │ │ │ └── e2e.ts │ └── tsconfig.json ├── dashboard │ ├── .eslintrc.json │ ├── .storybook │ │ ├── main.ts │ │ ├── preview.ts │ │ └── tsconfig.json │ ├── common │ │ ├── add-event-user-id.ts │ │ ├── add-event.ts │ │ ├── api.ts │ │ ├── apis │ │ │ └── battlepass │ │ │ │ ├── battlepass.api.ts │ │ │ │ └── types.ts │ │ ├── calculate-battlepass-progress.ts │ │ ├── constants.ts │ │ ├── events.utils.ts │ │ ├── format-timestamp.ts │ │ ├── hackform.metadata.tsx │ │ ├── mock-sponsor.ts │ │ ├── parse-dob.ts │ │ ├── role.utils.ts │ │ ├── schools.ts │ │ ├── search-event-id.ts │ │ ├── search-event.ts │ │ ├── search-user.ts │ │ ├── types.ts │ │ └── utils.ts │ ├── components │ │ ├── battlepass │ │ │ ├── battlepass-description.tsx │ │ │ ├── battlepass-page.tsx │ │ │ ├── battlepass-points-bar.tsx │ │ │ ├── bonus-points │ │ │ │ ├── bonus-points-item.tsx │ │ │ │ ├── bonus-points-list.tsx │ │ │ │ └── types.ts │ │ │ └── leaderboard │ │ │ │ ├── battlepass-leaderboard.tsx │ │ │ │ └── types.ts │ │ ├── bottom-bar │ │ │ └── bottom-bar.tsx │ │ ├── events │ │ │ ├── calendar-card.tsx │ │ │ ├── event-card.tsx │ │ │ ├── event-details.tsx │ │ │ ├── event-list.global.css │ │ │ ├── event-list.module.css │ │ │ ├── event-list.tsx │ │ │ ├── events-calendar.tsx │ │ │ └── pinned-events.tsx │ │ ├── gray-box │ │ │ └── gray-box.tsx │ │ ├── gray-content-box │ │ │ ├── gray-content-box.stories.tsx │ │ │ └── gray-content-box.tsx │ │ ├── hacker-portal │ │ │ ├── apps-closed-placeholder.tsx │ │ │ ├── coming-soon.tsx │ │ │ ├── confirmed-placeholder.tsx │ │ │ ├── congrats-message.tsx │ │ │ ├── declined-placeholder.tsx │ │ │ ├── hacker-portal.stories.tsx │ │ │ ├── hacker-portal.tsx │ │ │ ├── rejection-message.tsx │ │ │ └── rsvp-closed-placeholder.tsx │ │ ├── hacker-profile │ │ │ └── edit-profile-card.tsx │ │ ├── hackerform │ │ │ ├── date-question │ │ │ │ └── date-question.tsx │ │ │ ├── file-question │ │ │ │ └── file-question.tsx │ │ │ ├── hackform-backnext-widget │ │ │ │ ├── hackform-backnext-widget.stories.tsx │ │ │ │ └── hackform-backnext-widget.tsx │ │ │ ├── hackform-end │ │ │ │ ├── hackform-end.stories.tsx │ │ │ │ └── hackform-end.tsx │ │ │ ├── hackform-introduction │ │ │ │ ├── hackform-introduction.stories.tsx │ │ │ │ └── hackform-introduction.tsx │ │ │ ├── hackform-question-header │ │ │ │ ├── hackform-question-header.stories.tsx │ │ │ │ └── hackform-question-header.tsx │ │ │ ├── hackform-question │ │ │ │ ├── hackform-question.stories.tsx │ │ │ │ └── hackform-question.tsx │ │ │ ├── hackform │ │ │ │ ├── hackform.stories.tsx │ │ │ │ └── hackform.tsx │ │ │ ├── long-text-question │ │ │ │ ├── long-text-question.stories.tsx │ │ │ │ └── long-text-question.tsx │ │ │ ├── multi-select-question │ │ │ │ └── multi-select-question.tsx │ │ │ ├── other-field.tsx │ │ │ ├── question-creator │ │ │ │ ├── question-creator.stories.tsx │ │ │ │ └── question-creator.tsx │ │ │ ├── searchable-options-question │ │ │ │ ├── searchable-options-question.stories.tsx │ │ │ │ └── searchable-options-question.tsx │ │ │ ├── short-text-question │ │ │ │ └── short-text-question.tsx │ │ │ └── single-choice-input │ │ │ │ └── single-choice-input.tsx │ │ ├── hackform-tally │ │ │ └── hackform-tally.tsx │ │ ├── identity-portal │ │ │ ├── back-button │ │ │ │ └── back-button.tsx │ │ │ ├── check-in-box │ │ │ │ └── check-in-box.tsx │ │ │ ├── identity-portal.tsx │ │ │ ├── scrollable-list-box │ │ │ │ └── scrollable-list-box.tsx │ │ │ ├── search-event-box │ │ │ │ └── search-event-box.tsx │ │ │ ├── search-user-box │ │ │ │ └── search-user-box.tsx │ │ │ └── search-user-event-box │ │ │ │ └── search-user-event-box.tsx │ │ ├── nav │ │ │ ├── side-nav-button.tsx │ │ │ ├── side-nav.tsx │ │ │ ├── side-nav2.tsx │ │ │ └── top-nav.tsx │ │ ├── portal-menu │ │ │ ├── portal-menu.stories.tsx │ │ │ └── portal-menu.tsx │ │ ├── red-span.tsx │ │ ├── rsvp-form │ │ │ └── rsvp-form.tsx │ │ ├── sponsor-portal │ │ │ ├── dropdown.stories.tsx │ │ │ ├── dropdown.tsx │ │ │ ├── hacker-profile.stories.tsx │ │ │ ├── hacker-profile.tsx │ │ │ ├── hacker-tab.stories.tsx │ │ │ ├── hacker-tab.tsx │ │ │ ├── sponsor-portal.stories.tsx │ │ │ └── sponsor-portal.tsx │ │ ├── svg │ │ │ ├── hacksc-guy.tsx │ │ │ ├── hacksc-logo-nowords.tsx │ │ │ ├── hacksc-logo.tsx │ │ │ ├── star-4.tsx │ │ │ └── star-5.tsx │ │ ├── team │ │ │ ├── no-team-placeholder.tsx │ │ │ ├── team-create-form.tsx │ │ │ ├── team-header.tsx │ │ │ ├── team-members-widget.tsx │ │ │ └── team.module.css │ │ └── top-bar │ │ │ ├── top-bar.stories.tsx │ │ │ └── top-bar.tsx │ ├── hooks │ │ ├── redux │ │ │ └── hooks.ts │ │ ├── use-battlepass-api │ │ │ └── use-battlepass-api.tsx │ │ ├── use-hackform │ │ │ └── use-hackform.ts │ │ ├── use-hibiscus-user │ │ │ └── use-hibiscus-user.tsx │ │ └── use-team │ │ │ └── use-team.tsx │ ├── index.d.ts │ ├── jest.config.ts │ ├── layouts │ │ ├── portal-layout.tsx │ │ └── themeless-layout.tsx │ ├── middleware.ts │ ├── next-env.d.ts │ ├── next.config.js │ ├── pages │ │ ├── 404 │ │ │ └── index.tsx │ │ ├── _app.tsx │ │ ├── _document.js │ │ ├── api │ │ │ ├── battlepass │ │ │ │ ├── bonus-points-approve.ts │ │ │ │ ├── bonus-points.ts │ │ │ │ ├── leaderboard.ts │ │ │ │ ├── user-points │ │ │ │ │ └── [userId].ts │ │ │ │ └── user-rank │ │ │ │ │ └── [userId].ts │ │ │ ├── callback.ts │ │ │ ├── companies │ │ │ │ └── [userId].ts │ │ │ ├── company │ │ │ │ ├── [companyId].ts │ │ │ │ └── [companyId] │ │ │ │ │ ├── [eventId].ts │ │ │ │ │ └── save │ │ │ │ │ └── [participantId].ts │ │ │ ├── discord │ │ │ │ └── [userId].ts │ │ │ ├── get-user-hackform.tsx │ │ │ ├── hacker-profile │ │ │ │ ├── change-password │ │ │ │ │ └── index.ts │ │ │ │ ├── index.ts │ │ │ │ ├── profile-picture │ │ │ │ │ ├── get-url │ │ │ │ │ │ └── [userId].ts │ │ │ │ │ └── upload │ │ │ │ │ │ └── [userId].ts │ │ │ │ ├── resume │ │ │ │ │ ├── get-resume │ │ │ │ │ │ └── [userId].ts │ │ │ │ │ └── upload │ │ │ │ │ │ └── [userId].ts │ │ │ │ └── update-profile │ │ │ │ │ └── index.ts │ │ │ ├── hackform.ts │ │ │ ├── invite │ │ │ │ ├── accept.ts │ │ │ │ └── reject.ts │ │ │ ├── notes.ts │ │ │ ├── organizer │ │ │ │ ├── create.ts │ │ │ │ ├── disband.ts │ │ │ │ ├── invite.ts │ │ │ │ └── kick.ts │ │ │ ├── schools.ts │ │ │ ├── tally │ │ │ │ ├── webhook-mongodb.ts │ │ │ │ ├── webhook-supabase.ts │ │ │ │ └── webhook-waiver.ts │ │ │ └── team.ts │ │ ├── apply-2023-x │ │ │ ├── index.tsx │ │ │ └── success │ │ │ │ └── index.tsx │ │ ├── apply-2023 │ │ │ └── index.tsx │ │ ├── apply-2024 │ │ │ ├── index.tsx │ │ │ └── success │ │ │ │ └── index.tsx │ │ ├── events │ │ │ └── index.tsx │ │ ├── hacker-profile │ │ │ └── index.tsx │ │ ├── identity-portal │ │ │ ├── attendee-details-scan │ │ │ │ └── index.tsx │ │ │ ├── attendee-details │ │ │ │ └── index.tsx │ │ │ ├── attendee-event-scan │ │ │ │ └── index.tsx │ │ │ └── event-checkin │ │ │ │ └── index.tsx │ │ ├── index.tsx │ │ ├── leaderboard │ │ │ └── index.tsx │ │ ├── participant-database │ │ │ └── index.tsx │ │ ├── sponsor-booth │ │ │ └── index.tsx │ │ ├── styles.css │ │ └── team │ │ │ ├── index.tsx │ │ │ └── invite │ │ │ ├── accept.tsx │ │ │ └── reject.tsx │ ├── postcss.config.js │ ├── project.json │ ├── public │ │ ├── .gitkeep │ │ ├── arrow-right.svg │ │ ├── arrow.svg │ │ ├── assets │ │ │ └── earth-suitcase-moon.svg │ │ ├── download-button.svg │ │ ├── dropdown-arrow.svg │ │ ├── greenstar.svg │ │ ├── hackform-illustrations │ │ │ ├── detective-astronaut.svg │ │ │ ├── detective-curious.svg │ │ │ ├── detective-dance.svg │ │ │ ├── detective-lying.svg │ │ │ ├── detective.svg │ │ │ ├── earth-dancing.svg │ │ │ ├── earth-standing.svg │ │ │ ├── earth-waving.svg │ │ │ ├── earth.svg │ │ │ ├── green-puzzle.svg │ │ │ ├── heart-astronaut.svg │ │ │ ├── heart-flying.svg │ │ │ ├── heart-standing.svg │ │ │ ├── heart.svg │ │ │ ├── postcard-plane.svg │ │ │ ├── postcard-traveler.svg │ │ │ ├── postcard-world.svg │ │ │ ├── postcard.svg │ │ │ ├── purple-planet-jump.svg │ │ │ ├── purple-planet-stand.svg │ │ │ ├── purple-planet.svg │ │ │ ├── purple-puzzle.svg │ │ │ ├── puzzle.svg │ │ │ ├── stacking-puzzle.svg │ │ │ ├── stamp-coin.svg │ │ │ ├── stamp-earth.svg │ │ │ ├── stamp-hacksc.svg │ │ │ ├── stamp-heart.svg │ │ │ ├── stamp-planet.svg │ │ │ └── stamp-puzzle.svg │ │ ├── hacksc-logo.svg │ │ ├── hacksc-logo2.svg │ │ ├── img │ │ │ └── favicon.ico │ │ ├── log-out.svg │ │ ├── note.svg │ │ ├── pinkstar.svg │ │ ├── purplepin.svg │ │ ├── redstar.svg │ │ ├── representative-packet.pdf │ │ ├── save-alt.svg │ │ ├── save-fill-alt.svg │ │ ├── save-fill.svg │ │ ├── save-green.svg │ │ ├── save.svg │ │ ├── x-button.svg │ │ ├── yellowpin.svg │ │ └── yellowstar.svg │ ├── repository │ │ ├── attendee.repository.ts │ │ ├── battlepass.repository.ts │ │ ├── company.repository.ts │ │ ├── dashboard.repository.ts │ │ ├── discord.repository.ts │ │ ├── feature-flag.repository.ts │ │ ├── invite.repository.ts │ │ ├── mongo.client.ts │ │ ├── notes.repository.ts │ │ └── user.repository.ts │ ├── sentry.client.config.ts │ ├── sentry.edge.config.ts │ ├── sentry.properties │ ├── sentry.server.config.ts │ ├── store │ │ ├── hackform-slice.ts │ │ ├── menu-slice.ts │ │ └── store.ts │ ├── tailwind.config.js │ ├── tsconfig.json │ └── tsconfig.spec.json ├── discord-identity-bot │ ├── .eslintrc.json │ ├── jest.config.ts │ ├── project.json │ ├── src │ │ ├── app │ │ │ └── .gitkeep │ │ ├── assets │ │ │ └── .gitkeep │ │ ├── environments │ │ │ ├── environment.prod.ts │ │ │ └── environment.ts │ │ └── main.ts │ ├── tsconfig.app.json │ ├── tsconfig.json │ └── tsconfig.spec.json ├── event-service-next-e2e │ ├── .eslintrc.json │ ├── cypress.config.ts │ ├── project.json │ ├── src │ │ ├── e2e │ │ │ └── app.cy.ts │ │ ├── fixtures │ │ │ └── example.json │ │ └── support │ │ │ ├── app.po.ts │ │ │ ├── commands.ts │ │ │ └── e2e.ts │ └── tsconfig.json ├── event-service-next │ ├── .browserslistrc │ ├── .eslintrc.json │ ├── index.d.ts │ ├── jest.config.ts │ ├── middleware.ts │ ├── next-env.d.ts │ ├── next.config.js │ ├── pages │ │ ├── _app.tsx │ │ ├── api │ │ │ ├── error.ts │ │ │ ├── events │ │ │ │ ├── [event_id] │ │ │ │ │ ├── event-tags.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ └── pinned.ts │ │ │ │ └── index.ts │ │ │ ├── health.ts │ │ │ └── pinned-events │ │ │ │ └── [user_id].ts │ │ ├── index.module.scss │ │ ├── index.tsx │ │ └── styles.css │ ├── project.json │ ├── public │ │ └── .gitkeep │ ├── specs │ │ └── index.spec.tsx │ ├── src │ │ ├── app │ │ │ ├── app.module.scss │ │ │ ├── app.spec.tsx │ │ │ ├── app.tsx │ │ │ └── nx-welcome.tsx │ │ ├── assets │ │ │ └── .gitkeep │ │ ├── environments │ │ │ ├── environment.prod.ts │ │ │ └── environment.ts │ │ ├── favicon.ico │ │ ├── index.html │ │ ├── main.tsx │ │ ├── polyfills.ts │ │ ├── styles.scss │ │ └── utils │ │ │ ├── repository.ts │ │ │ └── types.ts │ ├── tsconfig.app.json │ ├── tsconfig.json │ └── tsconfig.spec.json ├── event-service │ ├── .chalice │ │ ├── deployed │ │ │ └── dev.json │ │ └── example.config.json │ ├── .flake8 │ ├── .gitignore │ ├── CHANGELOG.md │ ├── README.md │ ├── app.py │ ├── chalicelib │ │ ├── __init__.py │ │ ├── data_types.py │ │ ├── repository │ │ │ ├── __init__.py │ │ │ ├── engine.py │ │ │ ├── models.py │ │ │ └── repository.py │ │ └── something.py │ ├── configs │ │ ├── env.local.yml │ │ ├── env.prod.yml │ │ └── env.staging.yml │ ├── dockerfile │ ├── migrations │ │ ├── 20230525000000_init.sql │ │ └── 20230531000000_index_trigrams.sql │ ├── poetry.lock │ ├── poetry.toml │ ├── project.json │ ├── pyproject.toml │ ├── requirements.txt │ ├── serverless.yml │ └── tests │ │ ├── __init__.py │ │ └── conftest.py ├── interim │ ├── .eslintrc.json │ ├── .gitignore │ ├── common │ │ └── sendgrid.client.ts │ ├── components │ │ ├── email-newsletter-input-section │ │ │ ├── email-newsletter-input-section.spec.tsx │ │ │ └── email-newsletter-input-section.tsx │ │ ├── faqsection │ │ │ ├── faqsection.spec.tsx │ │ │ └── faqsection.tsx │ │ ├── footer │ │ │ ├── footer.spec.tsx │ │ │ └── footer.tsx │ │ ├── imagesection │ │ │ ├── imagesection.spec.tsx │ │ │ └── imagesection.tsx │ │ ├── logo-and-slogan │ │ │ ├── logo-and-slogan.spec.tsx │ │ │ └── logo-and-slogan.tsx │ │ ├── navbar │ │ │ ├── desktop-navbar │ │ │ │ ├── desktop-navbar.spec.tsx │ │ │ │ └── desktop-navbar.tsx │ │ │ ├── mobile-navbar │ │ │ │ ├── mobile-navbar.module.css │ │ │ │ ├── mobile-navbar.spec.tsx │ │ │ │ └── mobile-navbar.tsx │ │ │ ├── navbar.spec.tsx │ │ │ └── navbar.tsx │ │ ├── team-contact-blurbs │ │ │ ├── team-contact-blurbs.spec.tsx │ │ │ └── team-contact-blurbs.tsx │ │ └── thank-you-text │ │ │ ├── thank-you-text.spec.tsx │ │ │ └── thank-you-text.tsx │ ├── contexts │ │ └── SendgridClientProvider.tsx │ ├── hooks │ │ └── use-sendgrid-client │ │ │ └── use-sendgrid-client.tsx │ ├── index.d.ts │ ├── jest.config.ts │ ├── next-env.d.ts │ ├── next.config.js │ ├── pages │ │ ├── _app.tsx │ │ ├── _document.js │ │ ├── businesscard │ │ │ └── index.tsx │ │ ├── index.tsx │ │ └── sp23-diagrams │ │ │ └── index.tsx │ ├── project.json │ ├── public │ │ ├── .gitkeep │ │ └── img │ │ │ ├── dark-desktop-bg.svg │ │ │ ├── facebook.svg │ │ │ ├── favicon.ico │ │ │ ├── instagram.svg │ │ │ ├── light-desktop-bg.svg │ │ │ ├── light-mobile-bg.svg │ │ │ ├── linkedin.svg │ │ │ ├── twitter.svg │ │ │ └── youtube.svg │ ├── specs │ │ └── index.spec.tsx │ ├── tsconfig.json │ └── tsconfig.spec.json ├── log-server │ ├── .env.example │ ├── .eslintrc.json │ ├── .gitkeep │ ├── Dockerfile │ ├── jest.config.ts │ ├── project.json │ ├── src │ │ ├── app │ │ │ └── .gitkeep │ │ ├── assets │ │ │ └── .gitkeep │ │ ├── controllers │ │ │ ├── .gitkeep │ │ │ ├── key.controller.ts │ │ │ └── log.controller.ts │ │ ├── environments │ │ │ ├── environment.prod.ts │ │ │ └── environment.ts │ │ ├── main.ts │ │ ├── mappers │ │ │ └── .gitkeep │ │ ├── repositories │ │ │ ├── .gitkeep │ │ │ ├── __tests__ │ │ │ │ └── log.repository.test.ts │ │ │ ├── key.repository.ts │ │ │ ├── log.repository.ts │ │ │ └── repository.error.ts │ │ ├── routers │ │ │ ├── .gitkeep │ │ │ ├── key.router.ts │ │ │ └── log.router.ts │ │ └── services │ │ │ └── .gitkeep │ ├── tsconfig.app.json │ ├── tsconfig.json │ └── tsconfig.spec.json ├── podium-e2e │ ├── .eslintrc.json │ ├── cypress.config.ts │ ├── project.json │ ├── src │ │ ├── e2e │ │ │ └── app.cy.ts │ │ ├── fixtures │ │ │ └── example.json │ │ └── support │ │ │ ├── app.po.ts │ │ │ ├── commands.ts │ │ │ └── e2e.ts │ └── tsconfig.json ├── podium-service-e2e │ ├── .eslintrc.json │ ├── cypress.config.ts │ ├── project.json │ ├── src │ │ ├── e2e │ │ │ └── app.cy.ts │ │ ├── fixtures │ │ │ └── example.json │ │ └── support │ │ │ ├── app.po.ts │ │ │ ├── commands.ts │ │ │ └── e2e.ts │ └── tsconfig.json ├── podium-service │ ├── .eslintrc.json │ ├── index.d.ts │ ├── jest.config.ts │ ├── libs │ │ ├── calculatePoints.ts │ │ ├── calculateRankings.ts │ │ ├── isLocked.ts │ │ └── supabase.js │ ├── middleware.ts │ ├── next-env.d.ts │ ├── next.config.js │ ├── pages │ │ ├── _app.tsx │ │ ├── api │ │ │ ├── add_projects.ts │ │ │ ├── comments │ │ │ │ ├── [projectId].ts │ │ │ │ ├── [projectId] │ │ │ │ │ └── user │ │ │ │ │ │ └── [userId].ts │ │ │ │ └── id │ │ │ │ │ └── [commentId].ts │ │ │ ├── judges.ts │ │ │ ├── judges │ │ │ │ ├── [judgeId].ts │ │ │ │ └── bulk.ts │ │ │ ├── lock │ │ │ │ └── [verticalId].ts │ │ │ ├── notes │ │ │ │ └── [verticalId] │ │ │ │ │ └── [projectId] │ │ │ │ │ └── [userId].ts │ │ │ ├── projects.ts │ │ │ ├── projects │ │ │ │ ├── [verticalId].ts │ │ │ │ └── [verticalId] │ │ │ │ │ └── [projectId].ts │ │ │ ├── ranking.ts │ │ │ ├── ranking │ │ │ │ ├── [verticalId].ts │ │ │ │ └── [verticalId] │ │ │ │ │ └── [userId].ts │ │ │ ├── verticals.ts │ │ │ └── verticals │ │ │ │ └── [verticalId].ts │ │ └── index.tsx │ ├── project.json │ ├── specs │ │ └── index.spec.tsx │ ├── tsconfig.json │ ├── tsconfig.spec.json │ └── types │ │ └── types.ts ├── podium │ ├── .eslintrc.json │ ├── .gitignore │ ├── ProjectContext.tsx │ ├── components │ │ ├── OnHoldDroppable.tsx │ │ ├── OnHoldPreview.tsx │ │ ├── ProjectDetails.tsx │ │ ├── ProjectDraggable.tsx │ │ ├── comment │ │ │ ├── comment.module.scss │ │ │ ├── comment.spec.tsx │ │ │ └── comment.tsx │ │ └── send-comment │ │ │ ├── send-comment.module.css │ │ │ ├── send-comment.spec.tsx │ │ │ └── send-comment.tsx │ ├── index.d.ts │ ├── jest.config.ts │ ├── middleware.ts │ ├── next-env.d.ts │ ├── next.config.js │ ├── pages │ │ ├── _app.tsx │ │ ├── comments │ │ │ └── [projectId].tsx │ │ └── index.tsx │ ├── project.json │ ├── public │ │ ├── .gitkeep │ │ ├── button_close.svg │ │ ├── button_comment.svg │ │ ├── button_question.svg │ │ ├── chuubear.jpeg │ │ └── logo_word.png │ ├── specs │ │ └── index.spec.tsx │ ├── styles │ │ └── index.css.ts │ ├── tsconfig.json │ ├── tsconfig.spec.json │ ├── types.ts │ └── utils │ │ ├── getJudgeDetails.ts │ │ ├── getProjects.ts │ │ ├── getYoutubeThumbnail.ts │ │ ├── modal │ │ ├── modal.module.css │ │ └── modal.tsx │ │ ├── unrankProject.ts │ │ └── updateProjectRanking.ts ├── pointr │ ├── .eslintrc.json │ ├── common │ │ └── link.repository.ts │ ├── index.d.ts │ ├── jest.config.ts │ ├── next-env.d.ts │ ├── next.config.js │ ├── pages │ │ ├── [shortlink] │ │ │ └── index.tsx │ │ ├── _app.tsx │ │ ├── _document.tsx │ │ ├── index.tsx │ │ └── styles.css │ ├── project.json │ ├── public │ │ └── .gitkeep │ ├── specs │ │ └── index.spec.tsx │ ├── tsconfig.json │ └── tsconfig.spec.json ├── recruitment │ ├── .eslintrc.json │ ├── .gitignore │ ├── components │ │ ├── alum-destinations │ │ │ ├── alum-destinations.spec.tsx │ │ │ └── alum-destinations.tsx │ │ ├── footer │ │ │ ├── footer.spec.tsx │ │ │ └── footer.tsx │ │ ├── hacksc-memories │ │ │ ├── hacksc-memories.spec.tsx │ │ │ └── hacksc-memories.tsx │ │ ├── hero │ │ │ ├── hero.spec.tsx │ │ │ └── hero.tsx │ │ ├── navbar │ │ │ ├── desktop-navbar │ │ │ │ ├── desktop-navbar.spec.tsx │ │ │ │ └── desktop-navbar.tsx │ │ │ ├── mobile-navbar │ │ │ │ ├── mobile-navbar.module.css │ │ │ │ ├── mobile-navbar.spec.tsx │ │ │ │ └── mobile-navbar.tsx │ │ │ ├── navbar.spec.tsx │ │ │ └── navbar.tsx │ │ ├── studentxp │ │ │ ├── studentxp.spec.tsx │ │ │ └── studentxp.tsx │ │ └── teams │ │ │ ├── teams.spec.tsx │ │ │ └── teams.tsx │ ├── index.d.ts │ ├── jest.config.ts │ ├── next-env.d.ts │ ├── next.config.js │ ├── pages │ │ ├── _app.tsx │ │ ├── _document.js │ │ ├── index.tsx │ │ └── infosession │ │ │ └── index.tsx │ ├── project.json │ ├── public │ │ ├── .gitkeep │ │ └── img │ │ │ ├── dark-desktop-bg.svg │ │ │ ├── destinations │ │ │ ├── dest1.png │ │ │ └── dest2.png │ │ │ ├── facebook.svg │ │ │ ├── favicon.ico │ │ │ ├── globe.png │ │ │ ├── instagram.svg │ │ │ ├── light-desktop-bg.svg │ │ │ ├── light-mobile-bg.svg │ │ │ ├── light-narrow-mobile-bg.svg │ │ │ ├── lightbulb.png │ │ │ ├── linkedin.svg │ │ │ ├── memories │ │ │ ├── photo1.png │ │ │ ├── photo10.png │ │ │ ├── photo11.png │ │ │ ├── photo12.png │ │ │ ├── photo13.png │ │ │ ├── photo2.png │ │ │ ├── photo3.png │ │ │ ├── photo4.png │ │ │ ├── photo5.png │ │ │ ├── photo6.png │ │ │ ├── photo7.png │ │ │ ├── photo8.png │ │ │ ├── photo9.png │ │ │ └── photos4.mp4 │ │ │ ├── studentxp │ │ │ ├── begin-quotes.png │ │ │ ├── chloe.png │ │ │ ├── claire.png │ │ │ ├── end-quotes.png │ │ │ ├── katie.png │ │ │ ├── kelly.png │ │ │ └── max.png │ │ │ ├── twitter.svg │ │ │ └── vercel.svg │ ├── specs │ │ └── index.spec.tsx │ ├── tsconfig.json │ └── tsconfig.spec.json ├── sso-e2e │ ├── .eslintrc.json │ ├── cypress.json │ ├── project.json │ ├── src │ │ ├── fixtures │ │ │ └── example.json │ │ ├── integration │ │ │ └── app.spec.ts │ │ └── support │ │ │ ├── app.po.ts │ │ │ ├── commands.ts │ │ │ └── index.ts │ └── tsconfig.json ├── sso │ ├── .eslintrc.json │ ├── components │ │ ├── auth-components │ │ │ ├── styled-card.tsx │ │ │ └── styled-input.tsx │ │ ├── colored-shapes │ │ │ └── background-shapes.tsx │ │ ├── gray-link │ │ │ └── gray-link.tsx │ │ ├── login-card │ │ │ └── login-card.tsx │ │ ├── login-guard.tsx │ │ ├── otp-input │ │ │ └── otp-input.tsx │ │ ├── reset-card │ │ │ ├── reset-card.tsx │ │ │ └── reset-email-card.tsx │ │ ├── routeGuard.tsx │ │ ├── signup-card │ │ │ └── signup-card.tsx │ │ ├── svg │ │ │ ├── hacksc-guy-drawing.tsx │ │ │ ├── hacksc-guy.tsx │ │ │ └── hacksc-logo.tsx │ │ └── verify-card │ │ │ ├── reset-verify-card.tsx │ │ │ └── verify-card.tsx │ ├── index.d.ts │ ├── jest.config.ts │ ├── middleware.ts │ ├── next-env.d.ts │ ├── next.config.js │ ├── pages │ │ ├── _app.tsx │ │ ├── _document.tsx │ │ ├── api │ │ │ ├── unauthorized.ts │ │ │ ├── update-role │ │ │ │ └── [userId].ts │ │ │ └── verifyToken.ts │ │ ├── index.tsx │ │ ├── login │ │ │ └── index.tsx │ │ ├── logout │ │ │ └── index.tsx │ │ ├── reset-email │ │ │ └── index.tsx │ │ ├── reset-verify │ │ │ └── index.tsx │ │ ├── reset │ │ │ └── index.tsx │ │ ├── signup │ │ │ └── index.tsx │ │ ├── styles.css │ │ └── verify │ │ │ └── index.tsx │ ├── postcss.config.js │ ├── project.json │ ├── public │ │ ├── .gitkeep │ │ └── static │ │ │ ├── favicon.ico │ │ │ └── images │ │ │ ├── Logo.svg │ │ │ └── logo-2023.svg │ ├── tailwind.config.js │ ├── tsconfig.json │ └── tsconfig.spec.json ├── supabase-auth │ ├── .dev.vars.example │ ├── .gitignore │ ├── README.md │ ├── jest.config.ts │ ├── project.json │ ├── src │ │ ├── index.test.ts │ │ └── index.ts │ ├── tsconfig.json │ ├── tsconfig.spec.json │ └── wrangler.toml ├── ui-kit-2023-e2e │ ├── .eslintrc.json │ ├── cypress.config.ts │ ├── project.json │ ├── src │ │ ├── e2e │ │ │ ├── black-button │ │ │ │ └── black-button.cy.ts │ │ │ ├── blue-button │ │ │ │ └── blue-button.cy.ts │ │ │ ├── checkbox--Checkbox │ │ │ │ └── checkbox.cy.ts │ │ │ ├── confirmation │ │ │ │ └── confirmation.cy.ts │ │ │ ├── increment │ │ │ │ └── increment.cy.ts │ │ │ ├── information-enter │ │ │ │ └── information-enter.cy.ts │ │ │ ├── one-line-text │ │ │ │ └── one-line-text.cy.ts │ │ │ ├── paragraph-text │ │ │ │ └── paragraph-text.cy.ts │ │ │ ├── purple-button │ │ │ │ └── purple-button.cy.ts │ │ │ ├── radio--Radio │ │ │ │ └── radio.cy.ts │ │ │ ├── search │ │ │ │ └── search.cy.ts │ │ │ ├── slider--Slider │ │ │ │ └── slider.cy.ts │ │ │ └── switch--Switch │ │ │ │ └── switch.cy.ts │ │ ├── fixtures │ │ │ └── example.json │ │ └── support │ │ │ ├── commands.ts │ │ │ └── e2e.ts │ └── tsconfig.json └── www-2023 │ ├── .eslintrc.json │ ├── common │ └── sendgrid.client.ts │ ├── components │ ├── apply-now │ │ ├── apply-now.spec.tsx │ │ └── apply-now.tsx │ ├── email-newsletter-input-section │ │ ├── email-newsletter-input-section.spec.tsx │ │ └── email-newsletter-input-section.tsx │ ├── faqs │ │ ├── faqs.spec.tsx │ │ └── faqs.tsx │ ├── footer │ │ └── footer.tsx │ ├── hero │ │ └── hero.tsx │ ├── navbar │ │ ├── desktop-navbar │ │ │ ├── desktop-navbar.spec.tsx │ │ │ └── desktop-navbar.tsx │ │ ├── mobile-navbar │ │ │ ├── mobile-navbar.module.css │ │ │ ├── mobile-navbar.spec.tsx │ │ │ └── mobile-navbar.tsx │ │ ├── navbar.spec.tsx │ │ └── navbar.tsx │ ├── newsletter │ │ └── newsletter.tsx │ ├── solution-challenge │ │ ├── solution-challenge.spec.tsx │ │ └── solution-challenge.tsx │ ├── speakers │ │ ├── speakers.spec.tsx │ │ └── speakers.tsx │ ├── sponsors │ │ ├── sponsors.spec.tsx │ │ └── sponsors.tsx │ ├── topic │ │ ├── topic.spec.tsx │ │ └── topic.tsx │ └── verticals │ │ ├── verticals.spec.tsx │ │ └── verticals.tsx │ ├── contexts │ └── SendgridClientProvider.tsx │ ├── hooks │ └── use-sendgrid-client │ │ └── use-sendgrid-client.tsx │ ├── index.d.ts │ ├── jest.config.ts │ ├── next-env.d.ts │ ├── next.config.js │ ├── pages │ ├── _app.tsx │ ├── _document.js │ └── index.tsx │ ├── project.json │ ├── public │ ├── .gitkeep │ └── img │ │ ├── favicon.ico │ │ ├── graphics │ │ ├── bg-desktop.svg │ │ ├── bg-mobile.svg │ │ ├── coin.svg │ │ ├── earth.svg │ │ ├── hacksc.riv │ │ ├── heart.svg │ │ ├── planet.svg │ │ └── puzzle.svg │ │ ├── logos │ │ ├── 2k.png │ │ ├── accessibility.svg │ │ ├── arrcus.png │ │ ├── carc.png │ │ ├── elastic.png │ │ ├── facebook.svg │ │ ├── instagram.svg │ │ ├── linkedin.svg │ │ ├── logo.svg │ │ ├── mail.svg │ │ ├── soylent.png │ │ ├── stickermule.png │ │ ├── twitter.svg │ │ └── vercel.svg │ │ └── speakers │ │ ├── cammie.png │ │ ├── mark.png │ │ ├── matt.png │ │ ├── michael.png │ │ └── neil.png │ ├── tsconfig.json │ └── tsconfig.spec.json ├── babel.config.json ├── flake.lock ├── flake.nix ├── images ├── hibiscus-platform-logo-hi.png └── hibiscus-platform-logo.png ├── jest.config.ts ├── jest.preset.js ├── libs ├── .gitkeep ├── analytics │ ├── .babelrc │ ├── .eslintrc.json │ ├── README.md │ ├── jest.config.ts │ ├── package.json │ ├── project.json │ ├── src │ │ ├── index.ts │ │ └── lib │ │ │ └── google-analytics-4-script.tsx │ ├── tsconfig.json │ ├── tsconfig.lib.json │ └── tsconfig.spec.json ├── api-interfaces │ ├── .babelrc │ ├── .eslintrc.json │ ├── README.md │ ├── project.json │ ├── src │ │ ├── index.ts │ │ └── lib │ │ │ └── api-interfaces.ts │ ├── tsconfig.json │ └── tsconfig.lib.json ├── env │ ├── .babelrc │ ├── .eslintrc.json │ ├── README.md │ ├── jest.config.ts │ ├── package.json │ ├── project.json │ ├── src │ │ └── index.ts │ ├── tsconfig.json │ ├── tsconfig.lib.json │ └── tsconfig.spec.json ├── hackform-client │ ├── .babelrc │ ├── .eslintrc.json │ ├── README.md │ ├── jest.config.ts │ ├── package.json │ ├── project.json │ ├── src │ │ ├── index.ts │ │ └── lib │ │ │ ├── aws.ts │ │ │ ├── data-client.ts │ │ │ ├── pfp-client.ts │ │ │ └── resume-client.ts │ ├── tsconfig.json │ ├── tsconfig.lib.json │ └── tsconfig.spec.json ├── hibiscus-supabase-client │ ├── .babelrc │ ├── .eslintrc.json │ ├── README.md │ ├── jest.config.ts │ ├── package.json │ ├── project.json │ ├── src │ │ └── index.ts │ ├── tsconfig.json │ ├── tsconfig.lib.json │ └── tsconfig.spec.json ├── hibiscus-supabase-context │ ├── .babelrc │ ├── .eslintrc.json │ ├── README.md │ ├── jest.config.ts │ ├── project.json │ ├── src │ │ ├── index.ts │ │ └── lib │ │ │ └── hibiscus-supabase-context.tsx │ ├── tsconfig.json │ ├── tsconfig.lib.json │ └── tsconfig.spec.json ├── hibiscus-user-context │ ├── .babelrc │ ├── .eslintrc.json │ ├── README.md │ ├── jest.config.ts │ ├── project.json │ ├── src │ │ ├── index.ts │ │ └── lib │ │ │ └── hibiscus-user-context.tsx │ ├── tsconfig.json │ ├── tsconfig.lib.json │ └── tsconfig.spec.json ├── icons │ ├── .babelrc │ ├── .eslintrc.json │ ├── README.md │ ├── jest.config.ts │ ├── package.json │ ├── project.json │ ├── src │ │ ├── assets │ │ │ ├── chevron-right.svg │ │ │ ├── maximize-2.svg │ │ │ └── minimize-2.svg │ │ ├── index.ts │ │ └── lib │ │ │ ├── chevron-right-icon │ │ │ ├── chevron-right-icon.spec.tsx │ │ │ └── chevron-right-icon.tsx │ │ │ ├── maximize-two-arrow-icon │ │ │ ├── maximize-two-arrow-icon.spec.tsx │ │ │ └── maximize-two-arrow-icon.tsx │ │ │ └── minimize-two-arrow-icon │ │ │ ├── minimize-two-arrow-icon.spec.tsx │ │ │ └── minimize-two-arrow-icon.tsx │ ├── tsconfig.json │ ├── tsconfig.lib.json │ └── tsconfig.spec.json ├── metadata │ ├── .babelrc │ ├── .eslintrc.json │ ├── README.md │ ├── jest.config.ts │ ├── package.json │ ├── project.json │ ├── src │ │ ├── index.ts │ │ └── lib │ │ │ └── web.ts │ ├── tsconfig.json │ ├── tsconfig.lib.json │ └── tsconfig.spec.json ├── sso-client │ ├── .babelrc │ ├── .eslintrc.json │ ├── README.md │ ├── jest.config.ts │ ├── package.json │ ├── project.json │ ├── src │ │ ├── index.ts │ │ └── lib │ │ │ └── sso-client.ts │ ├── tsconfig.json │ ├── tsconfig.lib.json │ └── tsconfig.spec.json ├── styles │ ├── .babelrc │ ├── .eslintrc.json │ ├── README.md │ ├── jest.config.ts │ ├── package.json │ ├── project.json │ ├── src │ │ ├── index.ts │ │ └── lib │ │ │ ├── colors.ts │ │ │ └── global-styles.ts │ ├── tsconfig.json │ ├── tsconfig.lib.json │ └── tsconfig.spec.json ├── types │ ├── .babelrc │ ├── .eslintrc.json │ ├── README.md │ ├── package.json │ ├── project.json │ ├── src │ │ ├── index.ts │ │ └── lib │ │ │ ├── api │ │ │ ├── index.ts │ │ │ └── sso.ts │ │ │ ├── application-status.ts │ │ │ ├── form.ts │ │ │ ├── index.ts │ │ │ ├── roles.ts │ │ │ ├── supabase.gen.ts │ │ │ └── user.ts │ ├── tsconfig.json │ └── tsconfig.lib.json ├── ui-kit-2023 │ ├── .babelrc │ ├── .eslintrc.json │ ├── .storybook │ │ ├── main.ts │ │ ├── preview.ts │ │ └── tsconfig.json │ ├── README.md │ ├── jest.config.ts │ ├── package.json │ ├── project.json │ ├── src │ │ ├── index.ts │ │ └── lib │ │ │ ├── arrow-button │ │ │ ├── arrow-button.stories.tsx │ │ │ └── arrow-button.tsx │ │ │ ├── button │ │ │ ├── button.stories.tsx │ │ │ └── button.tsx │ │ │ ├── calendar │ │ │ ├── calendar.less │ │ │ ├── calendar.stories.tsx │ │ │ └── calendar.tsx │ │ │ ├── checkbox │ │ │ ├── checkbox.stories.tsx │ │ │ └── checkbox.tsx │ │ │ ├── color-span │ │ │ ├── color-span.spec.tsx │ │ │ └── color-span.tsx │ │ │ ├── combobox │ │ │ ├── combobox.stories.tsx │ │ │ └── combobox.tsx │ │ │ ├── confirmation │ │ │ ├── confirmation.stories.tsx │ │ │ └── confirmation.tsx │ │ │ ├── date-picker │ │ │ ├── date-picker.stories.tsx │ │ │ └── date-picker.tsx │ │ │ ├── glow-span │ │ │ ├── glow-span.spec.tsx │ │ │ └── glow-span.tsx │ │ │ ├── increment │ │ │ ├── increment.stories.tsx │ │ │ └── increment.tsx │ │ │ ├── one-line-text │ │ │ ├── one-line-text.stories.tsx │ │ │ └── one-line-text.tsx │ │ │ ├── paragraph-text │ │ │ ├── paragraph-text.stories.tsx │ │ │ └── paragraph-text.tsx │ │ │ ├── radio │ │ │ ├── radio.stories.tsx │ │ │ └── radio.tsx │ │ │ ├── search │ │ │ ├── search.stories.tsx │ │ │ └── search.tsx │ │ │ ├── slider │ │ │ ├── slider.stories.tsx │ │ │ └── slider.tsx │ │ │ └── switch │ │ │ ├── switch.stories.tsx │ │ │ └── switch.tsx │ ├── tsconfig.json │ ├── tsconfig.lib.json │ └── tsconfig.spec.json └── ui │ ├── .babelrc │ ├── .eslintrc.json │ ├── README.md │ ├── jest.config.ts │ ├── package.json │ ├── project.json │ ├── src │ ├── index.ts │ └── lib │ │ ├── accordion │ │ ├── accordion-2023.tsx │ │ └── accordion.tsx │ │ ├── flipcard │ │ └── flipcard.tsx │ │ ├── gradient-span │ │ └── gradient-span.tsx │ │ ├── heading │ │ └── heading.tsx │ │ ├── link │ │ └── link.tsx │ │ ├── modal │ │ ├── modal.module.css │ │ └── modal.tsx │ │ ├── spacer │ │ └── spacer.tsx │ │ └── text │ │ └── text.tsx │ ├── tsconfig.json │ ├── tsconfig.lib.json │ └── tsconfig.spec.json ├── migrations.json ├── nx.json ├── package.json ├── shell.nix ├── supabase ├── .gitignore ├── config.toml ├── migrations │ ├── 20220920065154_create_employees.sql │ ├── 20221004052337_create_rbac.sql │ ├── 20221008035834_add_roles.sql │ ├── 20221226001211_create_teams_tables.sql │ ├── 20230103024544_fix_team_invite_schema.sql │ ├── 20230109020457_add_email_and_profile_rls.sql │ ├── 20230110032809_linking_app_id.sql │ ├── 20230111213858_create_pointr_table.sql │ ├── 20230116021513_events_pinned_tables.sql │ ├── 20230116025536_add_wristband_id.sql │ ├── 20230116025537_add_volunteer_access.sql │ ├── 20230116062208_application_status.sql │ ├── 20230116101513_discord-id-bot-migration.sql │ ├── 20230119083157_add_application_statuses.sql │ ├── 20230119174552_add_leaderboard_table.sql │ ├── 20230119180516_add_event_log_table.sql │ ├── 20230119181530_add_bonus_points_tables.sql │ ├── 20230119182613_add_access_policies.sql │ ├── 20230119191100_add_bonus_point_statuses.sql │ ├── 20230125064704_add_notes_and_edit_participants.sql │ ├── 20230126033646_rsvp_form_modifications.sql │ ├── 20230126204833_companies_target_gradyear_majors.sql │ ├── 20230130001948_move_column_wristband_id_to_participants.sql │ ├── 20230130024217_add_table_company_saved_user_profiles.sql │ ├── 20230131165800_add_volunteer_access_participants.sql │ ├── 20230201213837_change_event_log_fkey.sql │ ├── 20230203200634_bridge_user_profiles_to_company_id.sql │ ├── 20230204070815_battlepass-redos.sql │ ├── 20230828000000_app_id_not_uuid.sql │ ├── 20231003190429_remote_schema.sql │ ├── 20231003191442_revoke_write_access_for_app_status_and_role.sql │ ├── 20231003193700_add_total_points.sql │ ├── 20231018000000_add_application_decision_time.sql │ ├── 20231025000000_add_discord_token_table.sql │ ├── 20231031000000_create_invitation.sql │ ├── 20231101000000_add_sponsor_access_events.sql │ └── 20231103000000_add_waiver_column.sql └── seed.sql ├── tools ├── generators │ ├── .gitkeep │ ├── hacksc-nextjs-application │ │ ├── index.ts │ │ ├── schema.json │ │ ├── schema.ts │ │ └── vercel.client.ts │ ├── hacksc-node-service │ │ ├── files │ │ │ ├── __tmpl__.env │ │ │ ├── __tmpl__.gitkeep │ │ │ └── __tmpl__Dockerfile │ │ ├── index.ts │ │ ├── schema.json │ │ └── schema.ts │ ├── hibiscus-python-library │ │ ├── files │ │ │ ├── .gitignore │ │ │ ├── CHANGELOG.md │ │ │ ├── README.md │ │ │ ├── __dot__flake8.template │ │ │ ├── __moduleName__ │ │ │ │ ├── __init__.py │ │ │ │ └── lib.py │ │ │ ├── poetry.toml │ │ │ ├── pyproject.toml │ │ │ ├── tests │ │ │ │ ├── __init__.py │ │ │ │ ├── conftest.py │ │ │ │ └── test_index.py │ │ │ └── tox.ini │ │ ├── graph │ │ │ └── dependency-graph.ts │ │ ├── index.ts │ │ ├── schema.d.ts │ │ ├── schema.json │ │ └── utils │ │ │ ├── logger.ts │ │ │ └── poetry.ts │ └── hibiscus-python-service │ │ ├── files │ │ ├── .gitignore │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── __dot__flake8.template │ │ ├── __moduleName__ │ │ │ ├── __init__.py │ │ │ └── app.py │ │ ├── configs │ │ │ ├── env.local.yml │ │ │ ├── env.prod.yml │ │ │ └── env.staging.yml │ │ ├── poetry.toml │ │ ├── pyproject.toml │ │ ├── serverless.yml │ │ ├── tests │ │ │ ├── __init__.py │ │ │ ├── conftest.py │ │ │ └── test_index.py │ │ └── tox.ini │ │ ├── graph │ │ └── dependency-graph.ts │ │ ├── index.ts │ │ ├── schema.d.ts │ │ ├── schema.json │ │ └── utils │ │ ├── logger.ts │ │ └── poetry.ts ├── keys │ ├── platform-credentials.json │ └── project-metadata.json ├── scripts │ ├── activate-env.sh │ ├── build-on-some-branches.sh │ ├── create-bonus-points.ts │ ├── create-many-fake-users.ts │ ├── create-user.ts │ ├── get-access-token.ts │ ├── publish.mjs │ ├── set-application-status.ts │ └── vercel-affected-nx-ignore.sh └── tsconfig.tools.json ├── tsconfig.base.json ├── tslint.json ├── workspace.json └── yarn.lock /.dockerignore: -------------------------------------------------------------------------------- 1 | **/node_modules/ 2 | /tmp 3 | /supabase 4 | /.venv -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | # Editor configuration, see http://editorconfig.org 2 | root = true 3 | 4 | [*] 5 | charset = utf-8 6 | indent_style = space 7 | indent_size = 2 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | 11 | [*.md] 12 | max_line_length = off 13 | trim_trailing_whitespace = false 14 | -------------------------------------------------------------------------------- /.eslintignore: -------------------------------------------------------------------------------- 1 | /**/.next/* -------------------------------------------------------------------------------- /.github/combine-prs.yml: -------------------------------------------------------------------------------- 1 | name: Github Action Merge Dependabot 2 | on: [push, pull_request] 3 | 4 | jobs: 5 | automerge: 6 | runs-on: ubuntu-latest 7 | 8 | permissions: 9 | pull-requests: write 10 | contents: write 11 | 12 | steps: 13 | - uses: fastify/github-action-merge-dependabot@v3.0.0 14 | -------------------------------------------------------------------------------- /.github/pull_request_template.md: -------------------------------------------------------------------------------- 1 | ### Description 2 | 3 | (_What have been done/changed_) 4 | 5 | - ... 6 | 7 | ### Testing plan 8 | 9 | (_How will we test the changes requested on this PR?_) 10 | 11 | - [ ] ... 12 | -------------------------------------------------------------------------------- /.husky/pre-commit: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env sh 2 | . "$(dirname -- "$0")/_/husky.sh" 3 | 4 | staged=$(git diff --name-only --staged --diff-filter=d) 5 | yarn format 6 | git add ${staged} 7 | -------------------------------------------------------------------------------- /.nvmrc: -------------------------------------------------------------------------------- 1 | 16.15.1 -------------------------------------------------------------------------------- /.pre-commit-config.yaml: -------------------------------------------------------------------------------- 1 | repos: 2 | - repo: https://github.com/pre-commit/pre-commit-hooks 3 | rev: v4.4.0 # Use the ref you want to point at 4 | hooks: 5 | - id: detect-private-key 6 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "singleQuote": true 3 | } 4 | -------------------------------------------------------------------------------- /.storybook/main.ts: -------------------------------------------------------------------------------- 1 | import type { StorybookConfig } from '@storybook/core-common'; 2 | 3 | export const rootMain: StorybookConfig = { 4 | stories: [], 5 | addons: ['@storybook/addon-essentials'], 6 | // webpackFinal: async (config, { configType }) => { 7 | // // Make whatever fine-grained changes you need that should apply to all storybook configs 8 | 9 | // // Return the altered config 10 | // return config; 11 | // }, 12 | }; 13 | -------------------------------------------------------------------------------- /.storybook/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../tsconfig.base.json", 3 | "exclude": [ 4 | "../**/*.spec.js", 5 | "../**/*.test.js", 6 | "../**/*.spec.ts", 7 | "../**/*.test.ts", 8 | "../**/*.spec.tsx", 9 | "../**/*.test.tsx", 10 | "../**/*.spec.jsx", 11 | "../**/*.test.jsx" 12 | ], 13 | "include": ["../**/*"] 14 | } 15 | -------------------------------------------------------------------------------- /.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": [ 3 | "nrwl.angular-console", 4 | "esbenp.prettier-vscode", 5 | "firsttris.vscode-jest-runner", 6 | "dbaeumer.vscode-eslint", 7 | "styled-components.vscode-styled-components" 8 | ] 9 | } 10 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "python.formatting.provider": "none", 3 | "nixEnvSelector.suggestion": false, 4 | "[python]": { 5 | "editor.defaultFormatter": "ms-python.black-formatter" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /CODEOWNERS: -------------------------------------------------------------------------------- 1 | * @VictiniX888 -------------------------------------------------------------------------------- /apps/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HackSC/hibiscus/370a6daee4cb7765011534c9b5ab05849f898a4a/apps/.gitkeep -------------------------------------------------------------------------------- /apps/airplane/airplane.yaml: -------------------------------------------------------------------------------- 1 | javascript: 2 | nodeVersion: '16' 3 | python: 4 | version: '3.10' 5 | -------------------------------------------------------------------------------- /apps/airplane/tasks/requirements.txt: -------------------------------------------------------------------------------- 1 | supabase==0.7.1 2 | boto3==1.26.83 3 | -------------------------------------------------------------------------------- /apps/battlepass-api/.flake8: -------------------------------------------------------------------------------- 1 | [flake8] 2 | extend-ignore = E203 3 | exclude = 4 | .git, 5 | __pycache__, 6 | build, 7 | dist, 8 | .tox, 9 | venv, 10 | .venv, 11 | .pytest_cache 12 | max-line-length = 120 13 | -------------------------------------------------------------------------------- /apps/battlepass-api/.gitignore: -------------------------------------------------------------------------------- 1 | .serverless/ 2 | dist/ 3 | configs/.env.local.yml -------------------------------------------------------------------------------- /apps/battlepass-api/CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | All notable changes to this project will be documented in this file. 4 | 5 | The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), 6 | and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). 7 | 8 | ## Unreleased 9 | -------------------------------------------------------------------------------- /apps/battlepass-api/README.md: -------------------------------------------------------------------------------- 1 | # battlepass-api 2 | 3 | ## About 4 | 5 | Project description here. 6 | 7 | [API Documentation](docs/source/api.md) 8 | 9 | ## [Change log](CHANGELOG.md) 10 | -------------------------------------------------------------------------------- /apps/battlepass-api/battlepass_api/__init__.py: -------------------------------------------------------------------------------- 1 | """A simple service to interact with Battlepass""" 2 | -------------------------------------------------------------------------------- /apps/battlepass-api/configs/env.local.yml: -------------------------------------------------------------------------------- 1 | SUPABASE_URL: ${ssm:/hibiscus/supabase/prod/api-url} 2 | SUPABASE_SERVICE_KEY: ${ssm:/hibiscus/supabase/prod/service-key} 3 | -------------------------------------------------------------------------------- /apps/battlepass-api/configs/env.prod.yml: -------------------------------------------------------------------------------- 1 | SUPABASE_URL: ${ssm:/hibiscus/supabase/prod/api-url} 2 | SUPABASE_SERVICE_KEY: ${ssm:/hibiscus/supabase/prod/service-key} 3 | -------------------------------------------------------------------------------- /apps/battlepass-api/configs/env.staging.yml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HackSC/hibiscus/370a6daee4cb7765011534c9b5ab05849f898a4a/apps/battlepass-api/configs/env.staging.yml -------------------------------------------------------------------------------- /apps/battlepass-api/poetry.toml: -------------------------------------------------------------------------------- 1 | [virtualenvs] 2 | in-project = true 3 | -------------------------------------------------------------------------------- /apps/battlepass-api/tests/__init__.py: -------------------------------------------------------------------------------- 1 | """unit tests.""" 2 | -------------------------------------------------------------------------------- /apps/battlepass-api/tests/conftest.py: -------------------------------------------------------------------------------- 1 | """Unit tests configuration module.""" 2 | 3 | pytest_plugins = [] 4 | -------------------------------------------------------------------------------- /apps/battlepass-api/tests/test_index.py: -------------------------------------------------------------------------------- 1 | def test_simple(): 2 | assert 1 + 1 == 2 3 | -------------------------------------------------------------------------------- /apps/battlepass-api/tox.ini: -------------------------------------------------------------------------------- 1 | [tox] 2 | isolated_build = True 3 | envlist = py38 4 | 5 | [testenv] 6 | whitelist_externals = 7 | poetry 8 | commands = 9 | poetry install -vv --no-root 10 | poetry run pytest {posargs} tests/ 11 | -------------------------------------------------------------------------------- /apps/battlepass-service/.dev.vars.example: -------------------------------------------------------------------------------- 1 | HIBISCUS_SUPABASE_SERVICE_KEY=PLACEHOLDER 2 | NEXT_PUBLIC_HIBISCUS_SUPABASE_API_URL=PLACEHOLDER -------------------------------------------------------------------------------- /apps/battlepass-service/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | dist 3 | .wrangler 4 | .dev.vars 5 | .env.test -------------------------------------------------------------------------------- /apps/battlepass-service/README.md: -------------------------------------------------------------------------------- 1 | ``` 2 | yarn nx serve battlepass-service 3 | ``` 4 | 5 | ``` 6 | yarn nx deploy battlepass-service 7 | ``` 8 | -------------------------------------------------------------------------------- /apps/battlepass-service/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ESNext", 4 | "module": "ESNext", 5 | "moduleResolution": "node", 6 | "esModuleInterop": true, 7 | "strict": true, 8 | "lib": ["esnext"], 9 | "types": ["@cloudflare/workers-types", "jest"], 10 | "jsx": "react-jsx", 11 | "jsxImportSource": "hono/jsx" 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /apps/battlepass-service/tsconfig.spec.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ESNext", 4 | "module": "ESNext", 5 | "moduleResolution": "node", 6 | "esModuleInterop": true, 7 | "strict": true, 8 | "lib": ["esnext"], 9 | "types": ["@cloudflare/workers-types", "jest"], 10 | "jsx": "react-jsx", 11 | "jsxImportSource": "hono/jsx" 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /apps/battlepass-service/wrangler.toml: -------------------------------------------------------------------------------- 1 | name = "battlepass-service" 2 | compatibility_date = "2023-01-01" 3 | -------------------------------------------------------------------------------- /apps/battlepass-services/.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": ["../../.eslintrc.json"], 3 | "ignorePatterns": ["!**/*"], 4 | "overrides": [ 5 | { 6 | "files": ["*.ts", "*.tsx", "*.js", "*.jsx"], 7 | "rules": {} 8 | }, 9 | { 10 | "files": ["*.ts", "*.tsx"], 11 | "rules": {} 12 | }, 13 | { 14 | "files": ["*.js", "*.jsx"], 15 | "rules": {} 16 | } 17 | ] 18 | } 19 | -------------------------------------------------------------------------------- /apps/battlepass-services/jest.config.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | export default { 3 | displayName: 'battlepass-services', 4 | preset: '../../jest.preset.js', 5 | globals: { 6 | 'ts-jest': { 7 | tsconfig: '/tsconfig.spec.json', 8 | }, 9 | }, 10 | testEnvironment: 'node', 11 | transform: { 12 | '^.+\\.[tj]s$': 'ts-jest', 13 | }, 14 | moduleFileExtensions: ['ts', 'js', 'html'], 15 | coverageDirectory: '../../coverage/apps/battlepass-services', 16 | }; 17 | -------------------------------------------------------------------------------- /apps/battlepass-services/src/app/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HackSC/hibiscus/370a6daee4cb7765011534c9b5ab05849f898a4a/apps/battlepass-services/src/app/.gitkeep -------------------------------------------------------------------------------- /apps/battlepass-services/src/assets/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HackSC/hibiscus/370a6daee4cb7765011534c9b5ab05849f898a4a/apps/battlepass-services/src/assets/.gitkeep -------------------------------------------------------------------------------- /apps/battlepass-services/src/environments/environment.prod.ts: -------------------------------------------------------------------------------- 1 | export const environment = { 2 | production: true, 3 | }; 4 | -------------------------------------------------------------------------------- /apps/battlepass-services/src/environments/environment.ts: -------------------------------------------------------------------------------- 1 | export const environment = { 2 | production: false, 3 | }; 4 | -------------------------------------------------------------------------------- /apps/battlepass-services/src/main.ts: -------------------------------------------------------------------------------- 1 | import 'reflect-metadata'; 2 | import * as dotenv from 'dotenv'; 3 | 4 | import app from './app'; 5 | 6 | dotenv.config(); 7 | 8 | const port = process.env.PORT || 3333; 9 | const server = app.listen(port, () => { 10 | console.log(`Listening at http://localhost:${port}/`); 11 | }); 12 | server.on('error', console.error); 13 | -------------------------------------------------------------------------------- /apps/battlepass-services/src/routers/bonusPoints.router.ts: -------------------------------------------------------------------------------- 1 | import * as express from 'express'; 2 | import { container } from 'tsyringe'; 3 | import { BonusPointsController } from '../controller/bonusPoints.controller'; 4 | 5 | const router = express.Router(); 6 | 7 | router.get('/', async (req, res) => 8 | container.resolve(BonusPointsController).getBonusPointEvents(req, res) 9 | ); 10 | 11 | export { router as BonusPointsRouter }; 12 | -------------------------------------------------------------------------------- /apps/battlepass-services/tsconfig.app.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../../dist/out-tsc", 5 | "module": "commonjs", 6 | "types": ["node", "express"] 7 | }, 8 | "exclude": ["jest.config.ts", "src/**/*.spec.ts", "src/**/*.test.ts"], 9 | "include": ["src/**/*.ts"] 10 | } 11 | -------------------------------------------------------------------------------- /apps/battlepass-services/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../tsconfig.base.json", 3 | "files": [], 4 | "include": [], 5 | "references": [ 6 | { 7 | "path": "./tsconfig.app.json" 8 | }, 9 | { 10 | "path": "./tsconfig.spec.json" 11 | } 12 | ] 13 | } 14 | -------------------------------------------------------------------------------- /apps/battlepass-services/tsconfig.spec.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../../dist/out-tsc", 5 | "module": "commonjs", 6 | "types": ["jest", "node"] 7 | }, 8 | "include": [ 9 | "jest.config.ts", 10 | "src/**/*.test.ts", 11 | "src/**/*.spec.ts", 12 | "src/**/*.d.ts" 13 | ] 14 | } 15 | -------------------------------------------------------------------------------- /apps/dashboard-e2e/.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": ["plugin:cypress/recommended", "../../.eslintrc.json"], 3 | "ignorePatterns": ["!**/*"], 4 | "overrides": [ 5 | { 6 | "files": ["*.ts", "*.tsx", "*.js", "*.jsx"], 7 | "rules": {} 8 | } 9 | ] 10 | } 11 | -------------------------------------------------------------------------------- /apps/dashboard-e2e/cypress.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'cypress'; 2 | import { nxE2EStorybookPreset } from '@nrwl/storybook/presets/cypress'; 3 | 4 | export default defineConfig({ 5 | e2e: nxE2EStorybookPreset(__dirname), 6 | }); 7 | -------------------------------------------------------------------------------- /apps/dashboard-e2e/src/e2e/QuestionCreator/QuestionCreator.cy.ts: -------------------------------------------------------------------------------- 1 | describe('dashboard: QuestionCreator component', () => { 2 | beforeEach(() => cy.visit('/iframe.html?id=questioncreator--primary')); 3 | 4 | it('should render the component', () => { 5 | cy.get('h1').should('contain', 'Welcome to QuestionCreator!'); 6 | }); 7 | }); 8 | -------------------------------------------------------------------------------- /apps/dashboard-e2e/src/e2e/check-in/check-in.cy.ts: -------------------------------------------------------------------------------- 1 | describe('dashboard: CheckIn component', () => { 2 | beforeEach(() => cy.visit('/iframe.html?id=checkin--primary')); 3 | 4 | it('should render the component', () => { 5 | cy.get('h1').should('contain', 'Welcome to CheckIn!'); 6 | }); 7 | }); 8 | -------------------------------------------------------------------------------- /apps/dashboard-e2e/src/e2e/gray-content-box/gray-content-box.cy.ts: -------------------------------------------------------------------------------- 1 | describe('dashboard: GrayContentBox component', () => { 2 | beforeEach(() => 3 | cy.visit('/iframe.html?id=graycontentbox--primary&args=location;') 4 | ); 5 | 6 | it('should render the component', () => { 7 | cy.get('h1').should('contain', 'Welcome to GrayContentBox!'); 8 | }); 9 | }); 10 | -------------------------------------------------------------------------------- /apps/dashboard-e2e/src/e2e/hacker-manager/hacker-manager.cy.ts: -------------------------------------------------------------------------------- 1 | describe('dashboard: HackerManager component', () => { 2 | beforeEach(() => cy.visit('/iframe.html?id=hackermanager--primary')); 3 | 4 | it('should render the component', () => { 5 | cy.get('h1').should('contain', 'Welcome to HackerManager!'); 6 | }); 7 | }); 8 | -------------------------------------------------------------------------------- /apps/dashboard-e2e/src/e2e/hackform-backnext-widget/hackform-backnext-widget.cy.ts: -------------------------------------------------------------------------------- 1 | describe('dashboard: HackformBackNextWidget component', () => { 2 | beforeEach(() => cy.visit('/iframe.html?id=hackformbacknextwidget--primary')); 3 | 4 | it('should render the component', () => { 5 | cy.get('h1').should('contain', 'Welcome to HackformBackNextWidget!'); 6 | }); 7 | }); 8 | -------------------------------------------------------------------------------- /apps/dashboard-e2e/src/e2e/hackform-end/hackform-end.cy.ts: -------------------------------------------------------------------------------- 1 | describe('dashboard: HackformEnding component', () => { 2 | beforeEach(() => cy.visit('/iframe.html?id=hackformending--primary')); 3 | 4 | it('should render the component', () => { 5 | cy.get('h1').should('contain', 'Welcome to HackformEnding!'); 6 | }); 7 | }); 8 | -------------------------------------------------------------------------------- /apps/dashboard-e2e/src/e2e/hackform-introduction/hackform-introduction.cy.ts: -------------------------------------------------------------------------------- 1 | describe('dashboard: HackformIntroduction component', () => { 2 | beforeEach(() => cy.visit('/iframe.html?id=hackformintroduction--primary')); 3 | 4 | it('should render the component', () => { 5 | cy.get('h1').should('contain', 'Welcome to HackformIntroduction!'); 6 | }); 7 | }); 8 | -------------------------------------------------------------------------------- /apps/dashboard-e2e/src/e2e/hackform-question-header/hackform-question-header.cy.ts: -------------------------------------------------------------------------------- 1 | describe('dashboard: HackformQuestionHeader component', () => { 2 | beforeEach(() => cy.visit('/iframe.html?id=hackformquestionheader--primary')); 3 | 4 | it('should render the component', () => { 5 | cy.get('h1').should('contain', 'Welcome to HackformQuestionHeader!'); 6 | }); 7 | }); 8 | -------------------------------------------------------------------------------- /apps/dashboard-e2e/src/e2e/hackform/hackform.cy.ts: -------------------------------------------------------------------------------- 1 | describe('dashboard: Hackerform component', () => { 2 | beforeEach(() => cy.visit('/iframe.html?id=hackerform--primary')); 3 | 4 | it('should render the component', () => { 5 | cy.get('h1').should('contain', 'Welcome to Hackerform!'); 6 | }); 7 | }); 8 | -------------------------------------------------------------------------------- /apps/dashboard-e2e/src/e2e/long-text-input/long-text-input.cy.ts: -------------------------------------------------------------------------------- 1 | describe('dashboard: LongTextQuestion component', () => { 2 | beforeEach(() => cy.visit('/iframe.html?id=longtextquestion--primary')); 3 | 4 | it('should render the component', () => { 5 | cy.get('h1').should('contain', 'Welcome to LongTextQuestion!'); 6 | }); 7 | }); 8 | -------------------------------------------------------------------------------- /apps/dashboard-e2e/src/e2e/navbar/navbar.cy.ts: -------------------------------------------------------------------------------- 1 | describe('dashboard: SidebarNav component', () => { 2 | beforeEach(() => cy.visit('/iframe.html?id=sidebarnav--primary')); 3 | 4 | it('should render the component', () => { 5 | cy.get('h1').should('contain', 'Welcome to SidebarNav!'); 6 | }); 7 | }); 8 | -------------------------------------------------------------------------------- /apps/dashboard-e2e/src/e2e/pointr/pointr.cy.ts: -------------------------------------------------------------------------------- 1 | describe('dashboard: Pointr component', () => { 2 | beforeEach(() => cy.visit('/iframe.html?id=pointr--primary')); 3 | 4 | it('should render the component', () => { 5 | cy.get('h1').should('contain', 'Welcome to Pointr!'); 6 | }); 7 | }); 8 | -------------------------------------------------------------------------------- /apps/dashboard-e2e/src/e2e/portal-menu/portal-menu.cy.ts: -------------------------------------------------------------------------------- 1 | describe('dashboard: PortalMenu component', () => { 2 | beforeEach(() => cy.visit('/iframe.html?id=portalmenu--primary')); 3 | 4 | it('should render the component', () => { 5 | cy.get('h1').should('contain', 'Welcome to PortalMenu!'); 6 | }); 7 | }); 8 | -------------------------------------------------------------------------------- /apps/dashboard-e2e/src/e2e/searchable-options-input/searchable-options-input.cy.ts: -------------------------------------------------------------------------------- 1 | describe('dashboard: SearchableOptionsInput component', () => { 2 | beforeEach(() => cy.visit('/iframe.html?id=searchableoptionsinput--primary')); 3 | 4 | it('should render the component', () => { 5 | cy.get('h1').should('contain', 'Welcome to SearchableOptionsInput!'); 6 | }); 7 | }); 8 | -------------------------------------------------------------------------------- /apps/dashboard-e2e/src/e2e/short-text-input/short-text-input.cy.ts: -------------------------------------------------------------------------------- 1 | describe('dashboard: ShortTextInput component', () => { 2 | beforeEach(() => cy.visit('/iframe.html?id=shorttextinput--primary')); 3 | 4 | it('should render the component', () => { 5 | cy.get('h1').should('contain', 'Welcome to ShortTextInput!'); 6 | }); 7 | }); 8 | -------------------------------------------------------------------------------- /apps/dashboard-e2e/src/e2e/top-bar/top-bar.cy.ts: -------------------------------------------------------------------------------- 1 | describe('dashboard: TopBar component', () => { 2 | beforeEach(() => 3 | cy.visit('/iframe.html?id=topbar--primary&args=userTag;role;') 4 | ); 5 | 6 | it('should render the component', () => { 7 | cy.get('h1').should('contain', 'Welcome to TopBar!'); 8 | }); 9 | }); 10 | -------------------------------------------------------------------------------- /apps/dashboard-e2e/src/fixtures/example.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Using fixtures to represent data", 3 | "email": "hello@cypress.io" 4 | } 5 | -------------------------------------------------------------------------------- /apps/dashboard-e2e/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../tsconfig.base.json", 3 | "compilerOptions": { 4 | "sourceMap": false, 5 | "outDir": "../../dist/out-tsc", 6 | "allowJs": true, 7 | "types": ["cypress", "node"] 8 | }, 9 | "include": ["src/**/*.ts", "src/**/*.js", "cypress.config.ts"] 10 | } 11 | -------------------------------------------------------------------------------- /apps/dashboard/.storybook/preview.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HackSC/hibiscus/370a6daee4cb7765011534c9b5ab05849f898a4a/apps/dashboard/.storybook/preview.ts -------------------------------------------------------------------------------- /apps/dashboard/common/apis/battlepass/types.ts: -------------------------------------------------------------------------------- 1 | export enum BonusPointsStatus { 2 | REJECTED = 'REJECTED', 3 | PENDING = 'PENDING', 4 | APPROVED = 'APPROVED', 5 | VERIFY = 'VERIFY', 6 | } 7 | -------------------------------------------------------------------------------- /apps/dashboard/common/format-timestamp.ts: -------------------------------------------------------------------------------- 1 | export function formatTimestamp(timestamp: string): string { 2 | const date = new Date(timestamp); 3 | return new Intl.DateTimeFormat('default', { 4 | month: 'long', 5 | day: 'numeric', 6 | hour: 'numeric', 7 | minute: 'numeric', 8 | }) 9 | .format(date) 10 | .replace(' at ', ', '); 11 | } 12 | -------------------------------------------------------------------------------- /apps/dashboard/common/parse-dob.ts: -------------------------------------------------------------------------------- 1 | export function parseDoB(dob: string): string { 2 | if (dob == null) { 3 | return ''; 4 | } 5 | 6 | if (dob.match(/^[0-9]{2}\/[0-9]{2}\/[0-9]{4}$/)) { 7 | return dob; 8 | } 9 | 10 | const [year, month, day] = dob.split('T', 1)[0].split('-'); 11 | return `${month}/${day}/${year}`; 12 | } 13 | -------------------------------------------------------------------------------- /apps/dashboard/common/role.utils.ts: -------------------------------------------------------------------------------- 1 | import { Colors2023 } from '@hibiscus/styles'; 2 | import { HibiscusRole } from '@hibiscus/types'; 3 | 4 | export const getColorsForRole = (role: HibiscusRole) => { 5 | return Colors2023.roleColors[role]; 6 | }; 7 | -------------------------------------------------------------------------------- /apps/dashboard/common/search-event.ts: -------------------------------------------------------------------------------- 1 | import { HibiscusSupabaseClient } from '@hibiscus/hibiscus-supabase-client'; 2 | 3 | export default async function searchEvent( 4 | supabase: HibiscusSupabaseClient 5 | ): Promise { 6 | const eventnameMatches = await supabase.getClient().from('events').select(); 7 | 8 | return eventnameMatches.data; 9 | } 10 | -------------------------------------------------------------------------------- /apps/dashboard/components/battlepass/bonus-points/types.ts: -------------------------------------------------------------------------------- 1 | import { BonusPointsStatus } from '../../../common/apis/battlepass/types'; 2 | 3 | export interface BonusPointItem { 4 | id: string; 5 | points: number; 6 | title: string; 7 | description: string; 8 | status: BonusPointsStatus; 9 | link: string; 10 | } 11 | -------------------------------------------------------------------------------- /apps/dashboard/components/battlepass/leaderboard/types.ts: -------------------------------------------------------------------------------- 1 | export interface LeaderboardEntry { 2 | firstName: string; 3 | lastName: string; 4 | rank: number; 5 | points: number; 6 | } 7 | -------------------------------------------------------------------------------- /apps/dashboard/components/events/event-list.global.css: -------------------------------------------------------------------------------- 1 | .swipeable-list-item__content { 2 | background-color: transparent !important; 3 | } 4 | -------------------------------------------------------------------------------- /apps/dashboard/components/hackerform/hackform/hackform.stories.tsx: -------------------------------------------------------------------------------- 1 | import type { ComponentStory, ComponentMeta } from '@storybook/react'; 2 | import { Hackerform } from './hackform'; 3 | 4 | const Story: ComponentMeta = { 5 | component: Hackerform, 6 | title: 'Hackerform', 7 | }; 8 | export default Story; 9 | 10 | const Template: ComponentStory = (args) => ( 11 | 12 | ); 13 | 14 | export const Primary = Template.bind({}); 15 | Primary.args = {}; 16 | -------------------------------------------------------------------------------- /apps/dashboard/components/portal-menu/portal-menu.stories.tsx: -------------------------------------------------------------------------------- 1 | import type { ComponentStory, ComponentMeta } from '@storybook/react'; 2 | import { PortalMenu } from './portal-menu'; 3 | 4 | const Story: ComponentMeta = { 5 | component: PortalMenu, 6 | title: 'PortalMenu', 7 | }; 8 | export default Story; 9 | 10 | const Template: ComponentStory = (args) => ( 11 | 12 | ); 13 | 14 | export const Primary = Template.bind({}); 15 | Primary.args = {}; 16 | -------------------------------------------------------------------------------- /apps/dashboard/components/red-span.tsx: -------------------------------------------------------------------------------- 1 | import { Colors2023 } from '@hibiscus/styles'; 2 | import styled from 'styled-components'; 3 | 4 | export const SpanRed = styled.span` 5 | color: ${Colors2023.RED.STANDARD}; 6 | `; 7 | -------------------------------------------------------------------------------- /apps/dashboard/components/top-bar/top-bar.stories.tsx: -------------------------------------------------------------------------------- 1 | import type { ComponentStory, ComponentMeta } from '@storybook/react'; 2 | import { TopBar } from './top-bar'; 3 | 4 | const Story: ComponentMeta = { 5 | component: TopBar, 6 | title: 'TopBar', 7 | }; 8 | export default Story; 9 | 10 | const Template: ComponentStory = (args) => ; 11 | 12 | export const Primary = Template.bind({}); 13 | Primary.args = { 14 | userTag: '', 15 | }; 16 | -------------------------------------------------------------------------------- /apps/dashboard/hooks/redux/hooks.ts: -------------------------------------------------------------------------------- 1 | import { useDispatch, useSelector } from 'react-redux'; 2 | import type { TypedUseSelectorHook } from 'react-redux'; 3 | import type { RootState, AppDispatch } from '../../store/store'; 4 | 5 | // Use throughout your app instead of plain `useDispatch` and `useSelector` 6 | export const useAppDispatch: () => AppDispatch = useDispatch; 7 | export const useAppSelector: TypedUseSelectorHook = useSelector; 8 | -------------------------------------------------------------------------------- /apps/dashboard/index.d.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable @typescript-eslint/no-explicit-any */ 2 | declare module '*.svg' { 3 | const content: any; 4 | export const ReactComponent: any; 5 | export default content; 6 | } 7 | -------------------------------------------------------------------------------- /apps/dashboard/jest.config.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | export default { 3 | displayName: 'dashboard', 4 | preset: '../../jest.preset.js', 5 | transform: { 6 | '^(?!.*\\.(js|jsx|ts|tsx|css|json)$)': '@nrwl/react/plugins/jest', 7 | '^.+\\.[tj]sx?$': ['babel-jest', { presets: ['@nrwl/next/babel'] }], 8 | }, 9 | moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx'], 10 | coverageDirectory: '../../coverage/apps/dashboard', 11 | }; 12 | -------------------------------------------------------------------------------- /apps/dashboard/next-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | /// 3 | 4 | // NOTE: This file should not be edited 5 | // see https://nextjs.org/docs/basic-features/typescript for more information. 6 | -------------------------------------------------------------------------------- /apps/dashboard/pages/api/callback.ts: -------------------------------------------------------------------------------- 1 | import { NextApiHandler } from 'next'; 2 | import { callbackApiHandler } from '@hibiscus/sso-client'; 3 | import { getEnv } from '@hibiscus/env'; 4 | 5 | const handler: NextApiHandler = callbackApiHandler( 6 | getEnv().Hibiscus.AppURL.portal 7 | ); 8 | 9 | export default handler; 10 | -------------------------------------------------------------------------------- /apps/dashboard/pages/leaderboard/index.tsx: -------------------------------------------------------------------------------- 1 | import { BattlepassAPIProvider } from '../../hooks/use-battlepass-api/use-battlepass-api'; 2 | import BattlepassPage from '../../components/battlepass/battlepass-page'; 3 | 4 | const Index = () => ( 5 | 6 | 7 | 8 | ); 9 | 10 | export default Index; 11 | -------------------------------------------------------------------------------- /apps/dashboard/postcss.config.js: -------------------------------------------------------------------------------- 1 | const { join } = require('path'); 2 | module.exports = { 3 | plugins: { 4 | tailwindcss: { 5 | config: join(__dirname, 'tailwind.config.js'), 6 | }, 7 | autoprefixer: {}, 8 | }, 9 | }; 10 | -------------------------------------------------------------------------------- /apps/dashboard/public/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HackSC/hibiscus/370a6daee4cb7765011534c9b5ab05849f898a4a/apps/dashboard/public/.gitkeep -------------------------------------------------------------------------------- /apps/dashboard/public/arrow-right.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /apps/dashboard/public/dropdown-arrow.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /apps/dashboard/public/img/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HackSC/hibiscus/370a6daee4cb7765011534c9b5ab05849f898a4a/apps/dashboard/public/img/favicon.ico -------------------------------------------------------------------------------- /apps/dashboard/public/representative-packet.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HackSC/hibiscus/370a6daee4cb7765011534c9b5ab05849f898a4a/apps/dashboard/public/representative-packet.pdf -------------------------------------------------------------------------------- /apps/dashboard/public/save-alt.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /apps/dashboard/public/save-fill-alt.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /apps/dashboard/public/save-fill.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /apps/dashboard/public/save-green.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /apps/dashboard/public/save.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /apps/dashboard/public/x-button.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /apps/dashboard/repository/mongo.client.ts: -------------------------------------------------------------------------------- 1 | import { singleton } from 'tsyringe'; 2 | import { getEnv } from '@hibiscus/env'; 3 | import { MongoClient } from 'mongodb'; 4 | 5 | @singleton() 6 | export class HibiscusMongoClient { 7 | private readonly mongo: MongoClient; 8 | constructor() { 9 | this.mongo = new MongoClient(getEnv().Hibiscus.FeatureFlag.MongoURI); 10 | } 11 | 12 | getClient() { 13 | return this.mongo; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /apps/dashboard/sentry.properties: -------------------------------------------------------------------------------- 1 | defaults.url=https://sentry.io/ 2 | defaults.org=hacksc-el 3 | defaults.project=dashboard 4 | cli.executable=../../node_modules/@sentry/cli/bin/sentry-cli 5 | -------------------------------------------------------------------------------- /apps/dashboard/tailwind.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | content: ['apps/dashboard/{pages,components,layouts}/**/*.{js,jsx,ts,tsx}'], 3 | theme: { 4 | extend: { 5 | colors: { 6 | 'theme-red': '#FF6347', 7 | 'theme-redward': '#FF514F', 8 | 'theme-blue': '#429FEE', 9 | 'theme-gray': '#777777', 10 | }, 11 | }, 12 | }, 13 | plugins: [], 14 | }; 15 | -------------------------------------------------------------------------------- /apps/dashboard/tsconfig.spec.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../../dist/out-tsc", 5 | "module": "commonjs", 6 | "types": ["jest", "node"], 7 | "jsx": "react" 8 | }, 9 | "include": [ 10 | "jest.config.ts", 11 | "**/*.test.ts", 12 | "**/*.spec.ts", 13 | "**/*.test.tsx", 14 | "**/*.spec.tsx", 15 | "**/*.test.js", 16 | "**/*.spec.js", 17 | "**/*.test.jsx", 18 | "**/*.spec.jsx", 19 | "**/*.d.ts" 20 | ] 21 | } 22 | -------------------------------------------------------------------------------- /apps/discord-identity-bot/.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": ["../../.eslintrc.json"], 3 | "ignorePatterns": ["!**/*"], 4 | "overrides": [ 5 | { 6 | "files": ["*.ts", "*.tsx", "*.js", "*.jsx"], 7 | "rules": {} 8 | }, 9 | { 10 | "files": ["*.ts", "*.tsx"], 11 | "rules": {} 12 | }, 13 | { 14 | "files": ["*.js", "*.jsx"], 15 | "rules": {} 16 | } 17 | ] 18 | } 19 | -------------------------------------------------------------------------------- /apps/discord-identity-bot/jest.config.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | export default { 3 | displayName: 'discord-identity-bot', 4 | preset: '../../jest.preset.js', 5 | globals: { 6 | 'ts-jest': { 7 | tsconfig: '/tsconfig.spec.json', 8 | }, 9 | }, 10 | testEnvironment: 'node', 11 | transform: { 12 | '^.+\\.[tj]s$': 'ts-jest', 13 | }, 14 | moduleFileExtensions: ['ts', 'js', 'html'], 15 | coverageDirectory: '../../coverage/apps/discord-identity-bot', 16 | }; 17 | -------------------------------------------------------------------------------- /apps/discord-identity-bot/src/app/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HackSC/hibiscus/370a6daee4cb7765011534c9b5ab05849f898a4a/apps/discord-identity-bot/src/app/.gitkeep -------------------------------------------------------------------------------- /apps/discord-identity-bot/src/assets/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HackSC/hibiscus/370a6daee4cb7765011534c9b5ab05849f898a4a/apps/discord-identity-bot/src/assets/.gitkeep -------------------------------------------------------------------------------- /apps/discord-identity-bot/src/environments/environment.prod.ts: -------------------------------------------------------------------------------- 1 | export const environment = { 2 | production: true, 3 | }; 4 | -------------------------------------------------------------------------------- /apps/discord-identity-bot/src/environments/environment.ts: -------------------------------------------------------------------------------- 1 | export const environment = { 2 | production: false, 3 | }; 4 | -------------------------------------------------------------------------------- /apps/discord-identity-bot/tsconfig.app.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../../dist/out-tsc", 5 | "module": "commonjs", 6 | "types": ["node", "express"] 7 | }, 8 | "exclude": ["jest.config.ts", "src/**/*.spec.ts", "src/**/*.test.ts"], 9 | "include": ["src/**/*.ts"] 10 | } 11 | -------------------------------------------------------------------------------- /apps/discord-identity-bot/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../tsconfig.base.json", 3 | "files": [], 4 | "include": [], 5 | "references": [ 6 | { 7 | "path": "./tsconfig.app.json" 8 | }, 9 | { 10 | "path": "./tsconfig.spec.json" 11 | } 12 | ] 13 | } 14 | -------------------------------------------------------------------------------- /apps/discord-identity-bot/tsconfig.spec.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../../dist/out-tsc", 5 | "module": "commonjs", 6 | "types": ["jest", "node"] 7 | }, 8 | "include": [ 9 | "jest.config.ts", 10 | "src/**/*.test.ts", 11 | "src/**/*.spec.ts", 12 | "src/**/*.d.ts" 13 | ] 14 | } 15 | -------------------------------------------------------------------------------- /apps/event-service-next-e2e/.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": ["plugin:cypress/recommended", "../../.eslintrc.json"], 3 | "ignorePatterns": ["!**/*"], 4 | "overrides": [ 5 | { 6 | "files": ["*.ts", "*.tsx", "*.js", "*.jsx"], 7 | "rules": {} 8 | } 9 | ] 10 | } 11 | -------------------------------------------------------------------------------- /apps/event-service-next-e2e/cypress.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'cypress'; 2 | import { nxE2EPreset } from '@nrwl/cypress/plugins/cypress-preset'; 3 | 4 | export default defineConfig({ 5 | e2e: nxE2EPreset(__dirname), 6 | }); 7 | -------------------------------------------------------------------------------- /apps/event-service-next-e2e/src/e2e/app.cy.ts: -------------------------------------------------------------------------------- 1 | import { getGreeting } from '../support/app.po'; 2 | 3 | describe('event-service-next', () => { 4 | beforeEach(() => cy.visit('/')); 5 | 6 | it('should display welcome message', () => { 7 | // Custom command example, see `../support/commands.ts` file 8 | cy.login('my-email@something.com', 'myPassword'); 9 | 10 | // Function helper example, see `../support/app.po.ts` file 11 | getGreeting().contains('Welcome event-service-next'); 12 | }); 13 | }); 14 | -------------------------------------------------------------------------------- /apps/event-service-next-e2e/src/fixtures/example.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Using fixtures to represent data", 3 | "email": "hello@cypress.io" 4 | } 5 | -------------------------------------------------------------------------------- /apps/event-service-next-e2e/src/support/app.po.ts: -------------------------------------------------------------------------------- 1 | export const getGreeting = () => cy.get('h1'); 2 | -------------------------------------------------------------------------------- /apps/event-service-next-e2e/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../tsconfig.base.json", 3 | "compilerOptions": { 4 | "sourceMap": false, 5 | "outDir": "../../dist/out-tsc", 6 | "allowJs": true, 7 | "types": ["cypress", "node"] 8 | }, 9 | "include": ["src/**/*.ts", "src/**/*.js", "cypress.config.ts"] 10 | } 11 | -------------------------------------------------------------------------------- /apps/event-service-next/index.d.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable @typescript-eslint/no-explicit-any */ 2 | declare module '*.svg' { 3 | const content: any; 4 | export const ReactComponent: any; 5 | export default content; 6 | } 7 | -------------------------------------------------------------------------------- /apps/event-service-next/jest.config.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | export default { 3 | displayName: 'event-service-next', 4 | preset: '../../jest.preset.js', 5 | transform: { 6 | '^(?!.*\\.(js|jsx|ts|tsx|css|json)$)': '@nrwl/react/plugins/jest', 7 | '^.+\\.[tj]sx?$': ['babel-jest', { presets: ['@nrwl/next/babel'] }], 8 | }, 9 | moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx'], 10 | coverageDirectory: '../../coverage/apps/event-service-next', 11 | }; 12 | -------------------------------------------------------------------------------- /apps/event-service-next/next-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | /// 3 | 4 | // NOTE: This file should not be edited 5 | // see https://nextjs.org/docs/basic-features/typescript for more information. 6 | -------------------------------------------------------------------------------- /apps/event-service-next/pages/_app.tsx: -------------------------------------------------------------------------------- 1 | import { AppProps } from 'next/app'; 2 | import Head from 'next/head'; 3 | import './styles.css'; 4 | 5 | function CustomApp({ Component, pageProps }: AppProps) { 6 | return ( 7 | <> 8 | 9 | Welcome to event-service-next! 10 | 11 |
12 | 13 |
14 | 15 | ); 16 | } 17 | 18 | export default CustomApp; 19 | -------------------------------------------------------------------------------- /apps/event-service-next/pages/api/error.ts: -------------------------------------------------------------------------------- 1 | import type { NextApiRequest, NextApiResponse } from 'next'; 2 | 3 | type ResponseData = { 4 | message: string; 5 | }; 6 | 7 | export default function handler( 8 | req: NextApiRequest, 9 | res: NextApiResponse 10 | ) { 11 | const { message, status } = req.query; 12 | res.status(parseInt(status as string)).json({ message: message as string }); 13 | } 14 | -------------------------------------------------------------------------------- /apps/event-service-next/pages/api/health.ts: -------------------------------------------------------------------------------- 1 | import type { NextApiRequest, NextApiResponse } from 'next'; 2 | 3 | type ResponseData = { 4 | message: string; 5 | }; 6 | 7 | export default function handler( 8 | req: NextApiRequest, 9 | res: NextApiResponse 10 | ) { 11 | res.status(200).json({ message: 'ALIVE' }); 12 | } 13 | -------------------------------------------------------------------------------- /apps/event-service-next/pages/index.module.scss: -------------------------------------------------------------------------------- 1 | .page { 2 | } 3 | -------------------------------------------------------------------------------- /apps/event-service-next/public/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HackSC/hibiscus/370a6daee4cb7765011534c9b5ab05849f898a4a/apps/event-service-next/public/.gitkeep -------------------------------------------------------------------------------- /apps/event-service-next/specs/index.spec.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { render } from '@testing-library/react'; 3 | 4 | import Index from '../pages/index'; 5 | 6 | describe('Index', () => { 7 | it('should render successfully', () => { 8 | const { baseElement } = render(); 9 | expect(baseElement).toBeTruthy(); 10 | }); 11 | }); 12 | -------------------------------------------------------------------------------- /apps/event-service-next/src/app/app.module.scss: -------------------------------------------------------------------------------- 1 | /* Your styles goes here. */ 2 | -------------------------------------------------------------------------------- /apps/event-service-next/src/app/app.spec.tsx: -------------------------------------------------------------------------------- 1 | import { render } from '@testing-library/react'; 2 | 3 | import App from './app'; 4 | 5 | describe('App', () => { 6 | it('should render successfully', () => { 7 | const { baseElement } = render(); 8 | expect(baseElement).toBeTruthy(); 9 | }); 10 | 11 | it('should have a greeting as the title', () => { 12 | const { getByText } = render(); 13 | expect(getByText(/Welcome event-service-next/gi)).toBeTruthy(); 14 | }); 15 | }); 16 | -------------------------------------------------------------------------------- /apps/event-service-next/src/app/app.tsx: -------------------------------------------------------------------------------- 1 | // eslint-disable-next-line @typescript-eslint/no-unused-vars 2 | import styles from './app.module.scss'; 3 | import NxWelcome from './nx-welcome'; 4 | 5 | export function App() { 6 | return ( 7 | <> 8 | 9 |
10 | 11 | ); 12 | } 13 | 14 | export default App; 15 | -------------------------------------------------------------------------------- /apps/event-service-next/src/assets/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HackSC/hibiscus/370a6daee4cb7765011534c9b5ab05849f898a4a/apps/event-service-next/src/assets/.gitkeep -------------------------------------------------------------------------------- /apps/event-service-next/src/environments/environment.prod.ts: -------------------------------------------------------------------------------- 1 | export const environment = { 2 | production: true, 3 | }; 4 | -------------------------------------------------------------------------------- /apps/event-service-next/src/environments/environment.ts: -------------------------------------------------------------------------------- 1 | // This file can be replaced during build by using the `fileReplacements` array. 2 | // When building for production, this file is replaced with `environment.prod.ts`. 3 | 4 | export const environment = { 5 | production: false, 6 | }; 7 | -------------------------------------------------------------------------------- /apps/event-service-next/src/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HackSC/hibiscus/370a6daee4cb7765011534c9b5ab05849f898a4a/apps/event-service-next/src/favicon.ico -------------------------------------------------------------------------------- /apps/event-service-next/src/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | EventServiceNext 6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | -------------------------------------------------------------------------------- /apps/event-service-next/src/main.tsx: -------------------------------------------------------------------------------- 1 | import { StrictMode } from 'react'; 2 | import * as ReactDOM from 'react-dom/client'; 3 | 4 | import App from './app/app'; 5 | 6 | const root = ReactDOM.createRoot( 7 | document.getElementById('root') as HTMLElement 8 | ); 9 | root.render( 10 | 11 | 12 | 13 | ); 14 | -------------------------------------------------------------------------------- /apps/event-service-next/src/polyfills.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Polyfill stable language features. These imports will be optimized by `@babel/preset-env`. 3 | * 4 | * See: https://github.com/zloirock/core-js#babel 5 | */ 6 | import 'core-js/stable'; 7 | import 'regenerator-runtime/runtime'; 8 | -------------------------------------------------------------------------------- /apps/event-service-next/src/styles.scss: -------------------------------------------------------------------------------- 1 | /* You can add global styles to this file, and also import other style files */ 2 | -------------------------------------------------------------------------------- /apps/event-service/.flake8: -------------------------------------------------------------------------------- 1 | [flake8] 2 | extend-ignore = E203 3 | exclude = 4 | .git, 5 | __pycache__, 6 | build, 7 | dist, 8 | .tox, 9 | venv, 10 | .venv, 11 | .pytest_cache 12 | max-line-length = 120 13 | -------------------------------------------------------------------------------- /apps/event-service/.gitignore: -------------------------------------------------------------------------------- 1 | .serverless/ 2 | dist/ 3 | .coverage 4 | configs/env.local.yml 5 | .chalice/config.json 6 | .chalice/deployments 7 | -------------------------------------------------------------------------------- /apps/event-service/CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | All notable changes to this project will be documented in this file. 4 | 5 | The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), 6 | and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). 7 | 8 | ## Unreleased 9 | -------------------------------------------------------------------------------- /apps/event-service/README.md: -------------------------------------------------------------------------------- 1 | # event-service 2 | 3 | ## About 4 | 5 | Project description here. 6 | 7 | [API Documentation](docs/source/api.md) 8 | 9 | ## [Change log](CHANGELOG.md) 10 | -------------------------------------------------------------------------------- /apps/event-service/chalicelib/__init__.py: -------------------------------------------------------------------------------- 1 | """A simple event service for Hibiscus""" 2 | -------------------------------------------------------------------------------- /apps/event-service/chalicelib/repository/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HackSC/hibiscus/370a6daee4cb7765011534c9b5ab05849f898a4a/apps/event-service/chalicelib/repository/__init__.py -------------------------------------------------------------------------------- /apps/event-service/chalicelib/repository/engine.py: -------------------------------------------------------------------------------- 1 | import os 2 | from sqlalchemy import Engine, create_engine 3 | 4 | 5 | def __create_engine() -> Engine: 6 | return create_engine( 7 | f"cockroachdb://{os.getenv('DB_USERNAME')}:{os.getenv('DB_PASSWORD')}@{os.getenv('DB_URL')}:{os.getenv('DB_PORT')}/{os.getenv('DB_NAME')}", 8 | echo=True, 9 | ) 10 | 11 | 12 | engine = __create_engine() 13 | -------------------------------------------------------------------------------- /apps/event-service/chalicelib/something.py: -------------------------------------------------------------------------------- 1 | def add(a, b): 2 | if type(a) != int or type(b) != int: 3 | raise Exception("a,b must be integers") 4 | return a + b 5 | -------------------------------------------------------------------------------- /apps/event-service/configs/env.local.yml: -------------------------------------------------------------------------------- 1 | DB_USERNAME: postgres 2 | DB_PASSWORD: postgres 3 | DB_URL: localhost 4 | DB_PORT: 5432 5 | DB_NAME: events 6 | -------------------------------------------------------------------------------- /apps/event-service/configs/env.prod.yml: -------------------------------------------------------------------------------- 1 | DB_USERNAME: ${ssm:/hibiscus/event-service/prod/db-username} 2 | DB_PASSWORD: ${ssm:/hibiscus/event-service/prod/db-password} 3 | DB_URL: ${ssm:/hibiscus/event-service/prod/db-url} 4 | DB_PORT: ${ssm:/hibiscus/event-service/prod/db-port} 5 | DB_NAME: ${ssm:/hibiscus/event-service/prod/db-name} 6 | -------------------------------------------------------------------------------- /apps/event-service/configs/env.staging.yml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HackSC/hibiscus/370a6daee4cb7765011534c9b5ab05849f898a4a/apps/event-service/configs/env.staging.yml -------------------------------------------------------------------------------- /apps/event-service/dockerfile: -------------------------------------------------------------------------------- 1 | FROM postgres 2 | ENV POSTGRES_DB events 3 | ENV POSTGRES_USER postgres 4 | ENV POSTGRES_PASSWORD postgres 5 | 6 | COPY migrations /docker-entrypoint-initdb.d/ 7 | -------------------------------------------------------------------------------- /apps/event-service/migrations/20230531000000_index_trigrams.sql: -------------------------------------------------------------------------------- 1 | CREATE EXTENSION IF NOT EXISTS pg_trgm; 2 | 3 | CREATE INDEX event_name_trgm_idx ON public.events USING GIST (name gist_trgm_ops); 4 | CREATE INDEX event_location_trgm_idx ON public.events USING GIST (location gist_trgm_ops); 5 | -------------------------------------------------------------------------------- /apps/event-service/poetry.toml: -------------------------------------------------------------------------------- 1 | [virtualenvs] 2 | in-project = true 3 | -------------------------------------------------------------------------------- /apps/event-service/tests/__init__.py: -------------------------------------------------------------------------------- 1 | """unit tests.""" 2 | -------------------------------------------------------------------------------- /apps/event-service/tests/conftest.py: -------------------------------------------------------------------------------- 1 | """Unit tests configuration module.""" 2 | 3 | pytest_plugins = [] 4 | -------------------------------------------------------------------------------- /apps/interim/.gitignore: -------------------------------------------------------------------------------- 1 | .vercel 2 | -------------------------------------------------------------------------------- /apps/interim/components/faqsection/faqsection.spec.tsx: -------------------------------------------------------------------------------- 1 | import { render } from '@testing-library/react'; 2 | 3 | import FAQSection from './faqsection'; 4 | 5 | describe('FAQSection', () => { 6 | it('should render successfully', () => { 7 | const { baseElement } = render(); 8 | expect(baseElement).toBeTruthy(); 9 | }); 10 | }); 11 | -------------------------------------------------------------------------------- /apps/interim/components/footer/footer.spec.tsx: -------------------------------------------------------------------------------- 1 | import { render } from '@testing-library/react'; 2 | 3 | import Footer from './footer'; 4 | 5 | describe('Footer', () => { 6 | it('should render successfully', () => { 7 | const { baseElement } = render(