diff --git a/cms/schemaTypes/index.ts b/cms/schemaTypes/index.ts index 3aa5a54f..ad4e7ab2 100644 --- a/cms/schemaTypes/index.ts +++ b/cms/schemaTypes/index.ts @@ -1,5 +1,6 @@ import ama from './ama' import event from './event' +import invite from './invite' import location from './location' -export const schemaTypes = [ama, event, location] +export const schemaTypes = [ama, event, location, invite] diff --git a/cms/schemaTypes/invite.ts b/cms/schemaTypes/invite.ts new file mode 100644 index 00000000..2e75f706 --- /dev/null +++ b/cms/schemaTypes/invite.ts @@ -0,0 +1,23 @@ +import { defineField, defineType } from 'sanity' + +export default defineType({ + name: 'invite', + title: 'Invitation link', + type: 'document', + fields: [ + defineField({ + name: 'slug', + title: 'Slug', + type: 'slug', + }), + defineField({ + name: 'repo', + title: 'Repository to grant access to', + type: 'string', + }), + defineField({ + name: 'isActive', + type: 'boolean', + }), + ], +}) diff --git a/modules/invites/module.ts b/modules/invites/module.ts index 9ca6e33f..98952595 100644 --- a/modules/invites/module.ts +++ b/modules/invites/module.ts @@ -1,34 +1,40 @@ -import { - addServerHandler, - createResolver, - defineNuxtModule, - useNuxt, -} from 'nuxt/kit' +import { addServerHandler, createResolver, defineNuxtModule } from 'nuxt/kit' import { defu } from 'defu' +import { createClient } from '@sanity/client' export default defineNuxtModule({ meta: { name: 'invites', }, - defaults: { - map: { - euricom: 'danielroe/nailing-it-euricom-2025', - // slug: 'danielroe/', - } satisfies Record, - }, - setup (options) { - const nuxt = useNuxt() - const resolver = createResolver(import.meta.url) - const gitHubClientId = process.env.NUXT_PUBLIC_GITHUB_CLIENT_ID || nuxt.options.runtimeConfig.public.githubClientId + async setup (options, nuxt) { + nuxt.options.nitro.typescript = defu(nuxt.options.nitro.typescript, { + include: ['../modules/runtime/server/**/*'], + }) - nuxt.options.runtimeConfig.invites = { - map: options.map, + if (nuxt.options._prepare) { + return } - nuxt.options.nitro.typescript = defu(nuxt.options.nitro.typescript, { - include: ['../modules/runtime/server/**/*'], + const resolver = createResolver(import.meta.url) + const gitHubClientId = process.env.NUXT_PUBLIC_GITHUB_CLIENT_ID || nuxt.options.runtimeConfig.public.githubClientId + + // fetch invitations from Sanity + const sanityClient = createClient({ + projectId: '9bj3w2vo', + dataset: 'production', + apiVersion: '2025-02-19', + token: process.env.NUXT_SANITY_TOKEN, }) + const invitations = await sanityClient.fetch>(`*[_type == "invite" && isActive == true]{ + "slug": slug.current, + repo + }`) + + const map = Object.fromEntries(invitations.map(invite => [invite.slug, invite.repo])) + + nuxt.options.runtimeConfig.invites = { map } + if (!gitHubClientId || Object.values(options.map).length === 0) return const redirect = nuxt.options.dev diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 476631a5..1b2feb84 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -64,6 +64,9 @@ importers: '@nuxtjs/sanity': specifier: ^1.13.3 version: 1.13.3(@emotion/is-prop-valid@1.2.2)(@sanity/types@3.88.3(@types/react@18.3.21))(magicast@0.3.5)(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1)(styled-components@6.1.18(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.8.3) + '@sanity/client': + specifier: ^7.2.1 + version: 7.2.1(debug@4.4.0) '@unhead/vue': specifier: 2.0.9 version: 2.0.9(vue@3.5.13(typescript@5.8.3))