Skip to content

Commit 00cf9c8

Browse files
committed
Merge branch 'develop'
2 parents 4cd8b14 + 4496070 commit 00cf9c8

File tree

112 files changed

+5130
-1326
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

112 files changed

+5130
-1326
lines changed

.idea/icon.svg

Lines changed: 19 additions & 0 deletions
Loading

cloud/functions/package-lock.json

Lines changed: 14 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

cloud/functions/package.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
"lint": "eslint --ext .js,.ts .",
55
"build": "tsc",
66
"build:watch": "tsc --watch",
7-
"serve": "npm run build && firebase emulators:start --import data --export-on-exit --inspect-functions",
7+
"serve": "npm run build && MIGRATION_TOKEN=42 firebase emulators:start --import data --export-on-exit --inspect-functions",
88
"shell": "npm run build && firebase functions:shell",
99
"start": "npm run shell",
1010
"deploy": "firebase deploy --only functions",
@@ -24,9 +24,11 @@
2424
"firebase-functions": "^4.2.0",
2525
"lodash": "^4.17.21",
2626
"ts-pattern": "4.3.0",
27+
"uuid": "9.0.0",
2728
"zod": "3.21.4"
2829
},
2930
"devDependencies": {
31+
"@types/uuid": "9.0.2",
3032
"@typescript-eslint/eslint-plugin": "^5.12.0",
3133
"@typescript-eslint/parser": "^5.12.0",
3234
"eslint": "^8.9.0",

cloud/functions/src/crawlers/camping-des-speakers/crawler.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,9 @@ import {
44
BreakTimeSlot,
55
DailySchedule, DetailedTalk, ScheduleTimeSlot,
66
Speaker, TalksTimeSlot,
7-
} from "../../../../../shared/dayly-schedule.firestore";
7+
} from "../../../../../shared/daily-schedule.firestore";
88
import * as cheerio from 'cheerio';
99
import {ConferenceDescriptor} from "../../../../../shared/conference-descriptor.firestore";
10-
import {Day} from "../../../../../shared/event-list.firestore";
1110
import axios from "axios";
1211
import {
1312
BREAK_PARSER,
@@ -179,6 +178,7 @@ export const CAMPING_DES_SPEAKERS_CRAWLER: CrawlerKind<typeof CAMPING_DES_SPEAKE
179178
language: descriptor.supportedTalkLanguages.find(lang => lang.id === rawTalk!.lang)!.id,
180179
start: rawTalk!.start,
181180
end: rawTalk!.end,
181+
tags: []
182182
};
183183
return detailedTalk;
184184
});

cloud/functions/src/crawlers/crawl.ts

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@ import {WEB2DAY_CRAWLER} from "./web2day/crawler";
99
import {Temporal} from "@js-temporal/polyfill";
1010
import {CAMPING_DES_SPEAKERS_CRAWLER} from "./camping-des-speakers/crawler";
1111
import {DEVOXX_SCALA_CRAWLER} from "./devoxx-scala/crawler";
12+
import {match} from "ts-pattern";
13+
import {v4 as uuidv4} from "uuid"
14+
import {ConferenceOrganizerSpace} from "../../../../shared/conference-organizer-space.firestore";
1215
const axios = require('axios');
1316

1417
export type CrawlerKind<ZOD_TYPE extends z.ZodType> = {
@@ -106,6 +109,28 @@ const saveEvent = async function(event: FullEvent) {
106109
await db.collection("events").doc(event.id).set(event.info)
107110

108111
const firestoreEvent = await db.collection("events").doc(event.id);
112+
const organizerSpaceEntries = await firestoreEvent
113+
.collection('organizer-space')
114+
.listDocuments();
115+
116+
const { organizerSpaceContent, organizerSecretToken } = await match(organizerSpaceEntries.length)
117+
.with(0, async () => {
118+
const organizerSecretToken = uuidv4();
119+
const organizerSpaceContent: ConferenceOrganizerSpace = {
120+
organizerSecretToken,
121+
talkFeedbackViewerTokens: []
122+
}
123+
124+
await firestoreEvent.collection('organizer-space').doc(organizerSecretToken).set(organizerSpaceContent)
125+
return {organizerSecretToken, organizerSpaceContent};
126+
}).with(1, async () => {
127+
const organizerSecretToken = await organizerSpaceEntries[0].id;
128+
const organizerSpaceContent = (await firestoreEvent.collection('organizer-space').doc(organizerSecretToken).get()).data() as ConferenceOrganizerSpace;
129+
return {organizerSecretToken, organizerSpaceContent};
130+
}).otherwise(async () => {
131+
throw new Error(`More than 1 organizer-space entries detected (${organizerSpaceEntries.length}) for event ${event.id}`);
132+
})
133+
109134
await Promise.all(event.daySchedules.map(async daySchedule => {
110135
try {
111136
await firestoreEvent
@@ -121,6 +146,26 @@ const saveEvent = async function(event: FullEvent) {
121146
await firestoreEvent
122147
.collection("talks").doc(talk.id)
123148
.set(talk)
149+
150+
const existingTalkFeedbackViewerToken = organizerSpaceContent.talkFeedbackViewerTokens
151+
.find(tfvt => tfvt.eventId === event.id && tfvt.talkId === talk.id)
152+
153+
// If token already exists for the talk, let's not add it
154+
if(!existingTalkFeedbackViewerToken) {
155+
const talkFeedbackViewerSecretToken = uuidv4();
156+
157+
await firestoreEvent
158+
.collection("talks").doc(talk.id)
159+
.collection("feedbacks-access").doc(talkFeedbackViewerSecretToken)
160+
// Creating a fake entry so that feedbacks-access/{secretToken} node is created
161+
.collection('_empty').add({ _: 42 })
162+
163+
organizerSpaceContent.talkFeedbackViewerTokens.push({
164+
eventId: event.id,
165+
talkId: talk.id,
166+
secretToken: talkFeedbackViewerSecretToken
167+
});
168+
}
124169
}catch(e) {
125170
error(`Error while saving talk ${talk.id}: ${e?.toString()}`)
126171
}
@@ -133,6 +178,12 @@ const saveEvent = async function(event: FullEvent) {
133178
}catch(e) {
134179
error(`Error while storing conference descriptor ${event.conferenceDescriptor.id}: ${e?.toString()}`)
135180
}
181+
182+
try {
183+
await firestoreEvent.collection('organizer-space').doc(organizerSecretToken).set(organizerSpaceContent)
184+
}catch(e) {
185+
error(`Error while storing event's organizer-space content`)
186+
}
136187
}
137188

138189
export default crawlAll;

cloud/functions/src/crawlers/crawler-parsers.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,8 @@ export const DETAILED_TALK_PARSER = TALK_PARSER.extend({
163163
start: ISO_DATETIME_PARSER,
164164
end: ISO_DATETIME_PARSER,
165165
summary: z.string(),
166-
description: z.string()
166+
description: z.string(),
167+
tags: z.array(z.string())
167168
})
168169

169170
export const TIME_SLOT_BASE_PARSER = z.object({

cloud/functions/src/crawlers/devoxx-scala/crawler.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import {
1313
DetailedTalk, ScheduleTimeSlot,
1414
Speaker,
1515
TalksTimeSlot, ThemedTalkFormat, ThemedTrack
16-
} from "../../../../../shared/dayly-schedule.firestore"
16+
} from "../../../../../shared/daily-schedule.firestore"
1717
import { FullEvent } from "../../models/Event";
1818
import { ISODatetime } from "../../../../../shared/type-utils";
1919
import { ListableEvent } from "../../../../../shared/event-list.firestore";
@@ -204,7 +204,8 @@ export const DEVOXX_SCALA_CRAWLER: CrawlerKind<typeof DEVOXX_SCALA_DESCRIPTOR_PA
204204
},
205205
room,
206206
summary: talk.summaryAsHtml,
207-
description: talk.summaryAsHtml
207+
description: talk.summaryAsHtml,
208+
tags: []
208209
}
209210

210211
talks.push(detailedTalk);

cloud/functions/src/crawlers/devoxx/crawler.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import {
1212
DetailedTalk,
1313
Speaker,
1414
Talk
15-
} from "../../../../../shared/dayly-schedule.firestore"
15+
} from "../../../../../shared/daily-schedule.firestore"
1616
import {TalkStats} from "../../../../../shared/feedbacks.firestore";
1717
import { FullEvent } from "../../models/Event";
1818
import { ISODatetime, ISOLocalDate } from "../../../../../shared/type-utils";
@@ -190,7 +190,8 @@ const crawlDevoxxDay = async (eventId: string, day: string) => {
190190
start: start as ISODatetime,
191191
end: end as ISODatetime,
192192
summary: item.proposal.summary || "",
193-
description: item.proposal.description || ""
193+
description: item.proposal.description || "",
194+
tags: item.proposal.tags.map(t => t.name)
194195
};
195196

196197
return { talk, detailedTalk };

cloud/functions/src/crawlers/la-product-conf/crawler.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import {
1111
Talk,
1212
TalkFormat,
1313
TalksTimeSlot,
14-
} from "../../../../../shared/dayly-schedule.firestore";
14+
} from "../../../../../shared/daily-schedule.firestore";
1515
import * as cheerio from 'cheerio';
1616
import {match, P} from "ts-pattern";
1717
import {ConferenceDescriptor} from "../../../../../shared/conference-descriptor.firestore";
@@ -179,7 +179,8 @@ export const LA_PRODUCT_CONF_CRAWLER: CrawlerKind<typeof LA_PRODUCT_CONF_DESCRIP
179179
},
180180
room: descriptor.rooms[tabIdx],
181181
summary: '',
182-
description: ''
182+
description: '',
183+
tags: []
183184
};
184185

185186
talks.push(detailedTalk);

cloud/functions/src/crawlers/web2day/crawler.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import {
44
BreakTimeSlot,
55
DailySchedule, DetailedTalk, ScheduleTimeSlot,
66
Speaker, TalksTimeSlot,
7-
} from "../../../../../shared/dayly-schedule.firestore";
7+
} from "../../../../../shared/daily-schedule.firestore";
88
import * as cheerio from 'cheerio';
99
import {ConferenceDescriptor} from "../../../../../shared/conference-descriptor.firestore";
1010
import {Day} from "../../../../../shared/event-list.firestore";
@@ -216,6 +216,7 @@ export const WEB2DAY_CRAWLER: CrawlerKind<typeof WEB2DAY_PARSER> = {
216216
language: descriptor.supportedTalkLanguages.find(lang => lang.id === rawTalk!.lang)!.id,
217217
start: rawTalk!.start,
218218
end: rawTalk!.end,
219+
tags: []
219220
};
220221
return detailedTalk;
221222
});

0 commit comments

Comments
 (0)