Skip to content

Commit 6e7c8e3

Browse files
committed
Merge branch 'develop'
2 parents 72663b6 + 4869c34 commit 6e7c8e3

26 files changed

+335
-158
lines changed

cloud/firestore/firebase.json

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{
2+
"firestore": {
3+
"rules": "firestore.default.rules",
4+
"indexes": "firestore.default.indexes.json"
5+
}
6+
}

cloud/firestore/package.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,9 @@
55
"type": "module",
66
"scripts": {
77
"test": "firebase emulators:exec --only firestore \"jest --detectOpenHandles \"",
8-
"deploy": "firebase use ${FIREBASE_PROJECT_NAME:-voxxrin-v3} && firebase deploy --only firestore"
8+
"deploy:rules": "npx firebase-tools deploy --only firestore:rules --project ${FIREBASE_PROJECT_NAME:-voxxrin-v3}",
9+
"deploy:indexes": "npx firebase-tools deploy --only firestore:indexes --project ${FIREBASE_PROJECT_NAME:-voxxrin-v3} --force || true",
10+
"deploy": "concurrently 'npm run deploy:rules' 'npm run deploy:indexes'"
911
},
1012
"license": "Apache-2.0",
1113
"devDependencies": {

cloud/functions/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
"serve": "npm run build && env-cmd -f ./.env.local firebase emulators:start --import data --export-on-exit --inspect-functions",
88
"shell": "npm run build && firebase functions:shell",
99
"start": "npm run shell",
10-
"deploy": "firebase use ${FIREBASE_PROJECT_NAME:-voxxrin-v3} && firebase deploy --only functions",
10+
"deploy": "firebase deploy --only functions --project ${FIREBASE_PROJECT_NAME:-voxxrin-v3}",
1111
"logs": "firebase functions:log",
1212
"test": "vitest"
1313
},

cloud/functions/src/crawlers/codeurs-en-seine/crawler.ts

Lines changed: 27 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,8 @@ export const CODEURS_EN_SEINE_PARSER = EVENT_DESCRIPTOR_PARSER.omit({
3333
})
3434
})),
3535
// the old one was: https://www.codeursenseine.com/_ipx/w_256,q_75/%2Fimages%2Fspeakers%2F{speakerImage}
36-
speakerPictureTemplate: z.string().default(`https://www.codeursenseine.com/_next/image?url=%2Fimages%2Fspeakers%2F{speakerImage}&w=256&q=75`)
36+
speakerPictureTemplate: z.string().default(`https://www.codeursenseine.com/_next/image?url=%2Fimages%2Fspeakers%2F{speakerImage}&w=256&q=75`),
37+
unknownSpeakerIds: z.array(z.string()).optional().default([]),
3738
})
3839

3940
function extractIdFromUrl(url: string) {
@@ -112,9 +113,12 @@ export const CODEURS_EN_SEINE_CRAWLER: CrawlerKind<typeof CODEURS_EN_SEINE_PARSE
112113
await githubMDXCrawler.crawlDirectory("content/talks", (mdxFile, fileEntry) => {
113114
const fileMetadata = mdxFile.metadata as CESTalkMDXData;
114115

115-
const start = `${fileMetadata.start}+02:00` as ISODatetime
116-
const end = `${fileMetadata.end}+02:00` as ISODatetime
116+
const startZDT = Temporal.PlainDateTime.from(fileMetadata.start).toZonedDateTime(descriptor.timezone)
117+
const endZDT = Temporal.PlainDateTime.from(fileMetadata.end).toZonedDateTime(descriptor.timezone)
118+
const start = startZDT.toInstant().toString() as ISODatetime
119+
const end = endZDT.toInstant().toString() as ISODatetime
117120
const duration = durationFrom(start, end, descriptor);
121+
const talkId = fileEntry.name.substring(0, fileEntry.name.length - ".mdx".length);
118122

119123
return match([fileMetadata])
120124
.with([ { kind: P.union("conference","quicky","atelier","sponsor","pleniere","keynote") }], ([talkMetadata]) => {
@@ -133,10 +137,24 @@ export const CODEURS_EN_SEINE_CRAWLER: CrawlerKind<typeof CODEURS_EN_SEINE_PARSE
133137
return undefined;
134138
}
135139

136-
const speaker = fetchedSpeakers.find(sp => sp.id === speakerId)
137-
if(!speaker) {
138-
throw new Error(`No speaker found in fetched speakers with id: ${speakerId} !`);
139-
}
140+
const speaker = match(fetchedSpeakers.find(sp => sp.id === speakerId))
141+
.with(P.nullish, () => {
142+
if(descriptor.unknownSpeakerIds.includes(speakerId)) {
143+
const unknownSpeaker: Speaker = {
144+
id: speakerId,
145+
fullName: "Speaker inconnu",
146+
companyName: null,
147+
bio: null,
148+
social: [],
149+
photoUrl: null,
150+
}
151+
return unknownSpeaker;
152+
}
153+
154+
throw new Error(`No speaker found in fetched speakers with id: ${speakerId} ! (context: talkId=${talkId})`);
155+
})
156+
.otherwise(speaker => speaker)
157+
140158
return speaker;
141159
}).filter(sp => !!sp).map(sp => sp!);
142160

@@ -149,8 +167,8 @@ export const CODEURS_EN_SEINE_CRAWLER: CrawlerKind<typeof CODEURS_EN_SEINE_PARSE
149167
talkFormats.push(format);
150168
}
151169

152-
const talkDetails: DetailedTalk = {
153-
id: fileEntry.name.substring(0, fileEntry.name.length - ".mdx".length),
170+
const talkDetails: DetailedTalk = {
171+
id: talkId,
154172
start, end,
155173
speakers,
156174
summary: mdxFile.content,

cloud/functions/src/crawlers/crawl.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ export const LANGUAGE_FALLBACK_COLORS: HexColor[] = [
6868
];
6969

7070
export type CrawlCriteria = {
71-
eventIds?: string[]|undefined;
71+
crawlerIds?: string[]|undefined;
7272
crawlingToken?: string|undefined;
7373
dayIds?: string[]|undefined;
7474
}
@@ -105,15 +105,15 @@ const crawlAll = async function(criteria: CrawlCriteria) {
105105
const crawlerDescriptors = await resolveCrawlerDescriptorsMatchingWithToken(criteria.crawlingToken);
106106

107107
const matchingCrawlerDescriptors = crawlerDescriptors.filter(firestoreCrawler => {
108-
const eventIdConstraintMatches = !criteria.eventIds
109-
|| !criteria.eventIds.length
110-
|| criteria.eventIds.includes(firestoreCrawler.id);
108+
const eventIdConstraintMatches = !criteria.crawlerIds
109+
|| !criteria.crawlerIds.length
110+
|| criteria.crawlerIds.includes(firestoreCrawler.id);
111111

112112
return eventIdConstraintMatches;
113113
});
114114

115115
if(!matchingCrawlerDescriptors.length) {
116-
throw new Error(`No crawler found matching eventIds=${JSON.stringify(criteria.eventIds)}`);
116+
throw new Error(`No crawler found matching crawlerIds=${JSON.stringify(criteria.crawlerIds)}`);
117117
}
118118

119119
return await Promise.all(matchingCrawlerDescriptors.map(async crawlerDescriptor => {
@@ -370,7 +370,7 @@ const saveEvent = async function (event: FullEvent, crawlerDescriptor: z.infer<t
370370
}
371371
}),
372372
...event.talks.map(async talk => {
373-
if(!ratingsTalkIds.includes(talk.id)) {
373+
if(!ratingsTalkIds.includes(talk.id) && !talk.isOverflow) {
374374
await db.doc(`${resolvedEventFirestorePath(event.id, spaceToken)}/organizer-space/${organizerSecretToken}/ratings/${talk.id}`).create({})
375375
}
376376
})

cloud/functions/src/crawlers/openplanner/crawler.spec.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@ describe('openplanenr crawlers', () => {
1111
}, {
1212
id: 'sunnytech24', confName: `Sunny Tech '24`,
1313
descriptorUrl: `https://gist.githubusercontent.com/fcamblor/2b4cb4f3ee1f2861cfe2ebb434dc6c20/raw/sunnytech.json`
14+
}, {
15+
id: 'snowcamp25', confName: `Snowcamp '25`,
16+
descriptorUrl: `https://gist.githubusercontent.com/schassande/83afc84a6d6bb78ebed9b77399ebf8b6/raw/voxxrin-snowcamp-2025.json`
1417
}
1518
] as const;
1619

0 commit comments

Comments
 (0)