@@ -15,6 +15,10 @@ import {
1515 Track
1616} from "../../../../shared/daily-schedule.firestore" ;
1717import { ensureRoomsStatsFilledFor } from "../functions/firestore/services/stats-utils" ;
18+ import { getEventOrganizerToken , getFamilyOrganizerToken } from "../functions/firestore/services/publicTokens-utils" ;
19+ import { getCrawlersMatching } from "../functions/firestore/services/crawlers-utils" ;
20+ import { ListableEvent } from "../../../../shared/event-list.firestore" ;
21+ import { ConferenceDescriptor } from "../../../../shared/conference-descriptor.firestore" ;
1822
1923export type CrawlerKind < ZOD_TYPE extends z . ZodType > = {
2024 crawlerImpl : ( eventId : string , crawlerDescriptor : z . infer < ZOD_TYPE > , criteria : { dayIds ?: string [ ] | undefined } ) => Promise < FullEvent > ,
@@ -60,6 +64,33 @@ export type CrawlCriteria = {
6064 dayIds ?: string [ ] | undefined ;
6165}
6266
67+ async function resolveCrawlerDescriptorsMatchingWithToken ( crawlingToken : string ) {
68+ const fbCrawlerDescriptors = await match ( crawlingToken )
69+ . with ( P . string . startsWith ( "familyOrganizer:" ) , async ( familyOrganizerToken ) => {
70+ const familyToken = await getFamilyOrganizerToken ( familyOrganizerToken ) ;
71+ return getCrawlersMatching ( crawlersColl =>
72+ crawlersColl . where ( "eventFamily" , "in" , familyToken . eventFamilies )
73+ )
74+ } ) . with ( P . string . startsWith ( "eventOrganizer:" ) , async ( eventOrganizerToken ) => {
75+ const eventToken = await getEventOrganizerToken ( eventOrganizerToken ) ;
76+ return getCrawlersMatching ( crawlersColl =>
77+ crawlersColl . where ( "eventName" , "in" , eventToken . eventNames )
78+ )
79+ } ) . otherwise ( ( legacyCrawlingToken ) => {
80+ // TODO: Remove me once every event will have migrated to the new public-tokens
81+ // resolution policy
82+ return getCrawlersMatching ( crawlersColl =>
83+ crawlersColl . where ( "legacyCrawlingKeys" , "array-contains" , legacyCrawlingToken )
84+ )
85+ } )
86+
87+ if ( ! fbCrawlerDescriptors . length ) {
88+ throw new Error ( `No crawler found matching [${ crawlingToken } ] token !` )
89+ }
90+
91+ return fbCrawlerDescriptors ;
92+ }
93+
6394const crawlAll = async function ( criteria : CrawlCriteria ) {
6495 if ( ! criteria . crawlingToken ) {
6596 throw new Error ( `Missing crawlingToken mandatory query parameter !` )
@@ -68,31 +99,20 @@ const crawlAll = async function(criteria: CrawlCriteria) {
6899 info ( "Starting crawling" ) ;
69100 const start = Date . now ( ) ;
70101
71- const fbCrawlerDescriptorSnapshot = await db . collection ( "crawlers" )
72- . where ( "crawlingKeys" , "array-contains" , criteria . crawlingToken )
73- . get ( ) ;
74-
75-
76- if ( fbCrawlerDescriptorSnapshot . empty ) {
77- throw new Error ( `No crawler found matching [${ criteria . crawlingToken } ] token !` )
78- return ;
79- }
102+ const crawlerDescriptors = await resolveCrawlerDescriptorsMatchingWithToken ( criteria . crawlingToken ) ;
80103
81- const isAutoCrawling = criteria . crawlingToken . startsWith ( "auto:" ) ;
82- const matchingCrawlerDescriptors = fbCrawlerDescriptorSnapshot . docs . map ( ( snap , _ ) => {
83- return { ...FIREBASE_CRAWLER_DESCRIPTOR_PARSER . parse ( snap . data ( ) ) , id : snap . id }
84- } ) . filter ( firestoreCrawler => {
85- const dateConstraintMatches = isAutoCrawling
86- || Temporal . Now . instant ( ) . epochMilliseconds < Date . parse ( firestoreCrawler . stopAutoCrawlingAfter )
104+ const matchingCrawlerDescriptors = crawlerDescriptors . filter ( firestoreCrawler => {
105+ const dateConstraintMatches = Temporal . Now . instant ( ) . epochMilliseconds < Date . parse ( firestoreCrawler . stopAutoCrawlingAfter )
87106
88- const eventIdConstraintMatches = ! criteria . eventIds || ! criteria . eventIds . length || criteria . eventIds . includes ( firestoreCrawler . id ) ;
107+ const eventIdConstraintMatches = ! criteria . eventIds
108+ || ! criteria . eventIds . length
109+ || criteria . eventIds . includes ( firestoreCrawler . id ) ;
89110
90- return dateConstraintMatches && eventIdConstraintMatches ;
111+ return dateConstraintMatches && eventIdConstraintMatches ;
91112 } ) ;
92113
93114 if ( ! matchingCrawlerDescriptors . length ) {
94- throw new Error ( `No crawler found matching either eventIds=${ JSON . stringify ( criteria . eventIds ) } or crawlers' 'stopAutoCrawlingAfter' deadline` ) ;
95- return ;
115+ throw new Error ( `No crawler found matching either eventIds=${ JSON . stringify ( criteria . eventIds ) } or crawlers' 'stopAutoCrawlingAfter' deadline` ) ;
96116 }
97117
98118 return await Promise . all ( matchingCrawlerDescriptors . map ( async crawlerDescriptor => {
@@ -102,7 +122,6 @@ const crawlAll = async function(criteria: CrawlCriteria) {
102122 const crawler = await resolveCrawler ( crawlerDescriptor . kind ) ;
103123 if ( ! crawler ) {
104124 throw new Error ( `Error: no crawler found for kind: ${ crawlerDescriptor . kind } (with id=${ crawlerDescriptor . id } )` )
105- return ;
106125 }
107126
108127 info ( `crawling event ${ crawlerDescriptor . id } of type [${ crawlerDescriptor . kind } ]...` )
@@ -111,7 +130,7 @@ const crawlAll = async function(criteria: CrawlCriteria) {
111130
112131 const event = await crawler . crawlerImpl ( crawlerDescriptor . id , crawlerKindDescriptor , { dayIds : criteria . dayIds } ) ;
113132 const messages = sanityCheckEvent ( event ) ;
114- await saveEvent ( event )
133+ await saveEvent ( event , crawlerDescriptor )
115134
116135 const end = Temporal . Now . instant ( )
117136 return {
@@ -194,10 +213,16 @@ function sanityCheckEvent(event: FullEvent): string[] {
194213 return crawlingMessages ;
195214}
196215
197- const saveEvent = async function ( event : FullEvent ) {
216+ const saveEvent = async function ( event : FullEvent , crawlerDescriptor : z . infer < typeof FIREBASE_CRAWLER_DESCRIPTOR_PARSER > ) {
198217 info ( "saving event " + event . id )
199218
200- await db . collection ( "events" ) . doc ( event . id ) . set ( event . info )
219+ const listableEvent : ListableEvent = {
220+ ...event . info ,
221+ eventFamily : crawlerDescriptor . eventFamily ,
222+ eventName : crawlerDescriptor . eventName ,
223+ }
224+
225+ await db . collection ( "events" ) . doc ( event . id ) . set ( listableEvent )
201226
202227 const talksStatsAllInOneDoc = await db . doc ( `events/${ event . id } /talksStats-allInOne/self` ) . get ( )
203228 if ( ! talksStatsAllInOneDoc . exists ) {
@@ -284,6 +309,7 @@ const saveEvent = async function(event: FullEvent) {
284309 organizerSpaceContent . talkFeedbackViewerTokens . push ( {
285310 eventId : event . id ,
286311 talkId : talk . id ,
312+ speakersFullNames : talk . speakers . map ( sp => sp . fullName ) ,
287313 secretToken : talkFeedbackViewerSecretToken
288314 } ) ;
289315 }
@@ -303,9 +329,15 @@ const saveEvent = async function(event: FullEvent) {
303329 // TODO: Remove me once watch later will be properly implemented !
304330 event . conferenceDescriptor . features . remindMeOnceVideosAreAvailableEnabled = false ;
305331
332+ const confDescriptor : ConferenceDescriptor = {
333+ ...listableEvent ,
334+ ...event . conferenceDescriptor ,
335+ }
336+
306337 await firestoreEvent . collection ( 'event-descriptor' )
307338 . doc ( 'self' )
308- . set ( event . conferenceDescriptor ) ;
339+ . set ( confDescriptor ) ;
340+
309341 } catch ( e ) {
310342 error ( `Error while storing conference descriptor ${ event . conferenceDescriptor . id } : ${ e ?. toString ( ) } ` )
311343 }
0 commit comments