@@ -19,6 +19,7 @@ import Vapor
1919
2020
2121enum Ingestion {
22+
2223 struct Error : ProcessingError {
2324 var packageId : Package . Id
2425 var underlyingError : UnderlyingError
@@ -73,100 +74,95 @@ enum Ingestion {
7374 }
7475 }
7576 }
76- }
7777
7878
79- struct IngestCommand : AsyncCommand {
80- typealias Signature = SPICommand . Signature
79+ struct Command : AsyncCommand {
80+ typealias Signature = SPICommand . Signature
8181
82- var help : String { " Run package ingestion (fetching repository metadata) " }
82+ var help : String { " Run package ingestion (fetching repository metadata) " }
8383
84- func run( using context: CommandContext , signature: SPICommand . Signature ) async {
85- let client = context. application. client
86- let db = context. application. db
87- Current . setLogger ( Logger ( component: " ingest " ) )
84+ func run( using context: CommandContext , signature: SPICommand . Signature ) async {
85+ let client = context. application. client
86+ let db = context. application. db
87+ Current . setLogger ( Logger ( component: " ingest " ) )
8888
89- Self . resetMetrics ( )
89+ Self . resetMetrics ( )
9090
91- do {
92- try await ingest ( client: client, database: db, mode: . init( signature: signature) )
93- } catch {
94- Current . logger ( ) . error ( " \( error. localizedDescription) " )
95- }
91+ do {
92+ try await ingest ( client: client, database: db, mode: . init( signature: signature) )
93+ } catch {
94+ Current . logger ( ) . error ( " \( error. localizedDescription) " )
95+ }
9696
97- do {
98- try await AppMetrics . push ( client: client,
99- jobName: " ingest " )
100- } catch {
101- Current . logger ( ) . warning ( " \( error. localizedDescription) " )
97+ do {
98+ try await AppMetrics . push ( client: client,
99+ jobName: " ingest " )
100+ } catch {
101+ Current . logger ( ) . warning ( " \( error. localizedDescription) " )
102+ }
102103 }
103- }
104- }
105104
106-
107- extension IngestCommand {
108- static func resetMetrics( ) {
109- AppMetrics . ingestMetadataSuccessCount? . set ( 0 )
110- AppMetrics . ingestMetadataFailureCount? . set ( 0 )
105+ static func resetMetrics( ) {
106+ AppMetrics . ingestMetadataSuccessCount? . set ( 0 )
107+ AppMetrics . ingestMetadataFailureCount? . set ( 0 )
108+ }
111109 }
112- }
113110
114111
115- /// Ingest via a given mode: either one `Package` identified by its `Id` or a limited number of `Package`s.
116- /// - Parameters:
117- /// - client: `Client` object
118- /// - database: `Database` object
119- /// - mode: process a single `Package.Id` or a `limit` number of packages
120- /// - Returns: future
121- func ingest( client: Client ,
122- database: Database ,
123- mode: SPICommand . Mode ) async throws {
124- let start = DispatchTime . now ( ) . uptimeNanoseconds
125- defer { AppMetrics . ingestDurationSeconds? . time ( since: start) }
126-
127- switch mode {
128- case . id( let id) :
129- Current . logger ( ) . info ( " Ingesting (id: \( id) ) ... " )
130- let pkg = try await Package . fetchCandidate ( database, id: id)
131- await ingest ( client: client, database: database, packages: [ pkg] )
132-
133- case . limit( let limit) :
134- Current . logger ( ) . info ( " Ingesting (limit: \( limit) ) ... " )
135- let packages = try await Package . fetchCandidates ( database, for: . ingestion, limit: limit)
136- Current . logger ( ) . info ( " Candidate count: \( packages. count) " )
137- await ingest ( client: client, database: database, packages: packages)
138-
139- case . url( let url) :
140- Current . logger ( ) . info ( " Ingesting (url: \( url) ) ... " )
141- let pkg = try await Package . fetchCandidate ( database, url: url)
142- await ingest ( client: client, database: database, packages: [ pkg] )
112+ /// Ingest via a given mode: either one `Package` identified by its `Id` or a limited number of `Package`s.
113+ /// - Parameters:
114+ /// - client: `Client` object
115+ /// - database: `Database` object
116+ /// - mode: process a single `Package.Id` or a `limit` number of packages
117+ /// - Returns: future
118+ static func ingest( client: Client ,
119+ database: Database ,
120+ mode: SPICommand . Mode ) async throws {
121+ let start = DispatchTime . now ( ) . uptimeNanoseconds
122+ defer { AppMetrics . ingestDurationSeconds? . time ( since: start) }
123+
124+ switch mode {
125+ case . id( let id) :
126+ Current . logger ( ) . info ( " Ingesting (id: \( id) ) ... " )
127+ let pkg = try await Package . fetchCandidate ( database, id: id)
128+ await ingest ( client: client, database: database, packages: [ pkg] )
129+
130+ case . limit( let limit) :
131+ Current . logger ( ) . info ( " Ingesting (limit: \( limit) ) ... " )
132+ let packages = try await Package . fetchCandidates ( database, for: . ingestion, limit: limit)
133+ Current . logger ( ) . info ( " Candidate count: \( packages. count) " )
134+ await ingest ( client: client, database: database, packages: packages)
135+
136+ case . url( let url) :
137+ Current . logger ( ) . info ( " Ingesting (url: \( url) ) ... " )
138+ let pkg = try await Package . fetchCandidate ( database, url: url)
139+ await ingest ( client: client, database: database, packages: [ pkg] )
140+ }
143141 }
144- }
145142
146143
147- /// Main ingestion function. Fetched package metadata from hosting provider and updates `Repositoy` and `Package`s.
148- /// - Parameters:
149- /// - client: `Client` object
150- /// - database: `Database` object
151- /// - packages: packages to be ingested
152- /// - Returns: future
153- func ingest( client: Client ,
154- database: Database ,
155- packages: [ Joined < Package , Repository > ] ) async {
156- Current . logger ( ) . debug ( " Ingesting \( packages. compactMap { $0. model. id} ) " )
157- AppMetrics . ingestCandidatesCount? . set ( packages. count)
158-
159- await withTaskGroup ( of: Void . self) { group in
160- for pkg in packages {
161- group. addTask {
162- await Ingestion . ingest ( client: client, database: database, package : pkg)
144+ /// Main ingestion function. Fetched package metadata from hosting provider and updates `Repositoy` and `Package`s.
145+ /// - Parameters:
146+ /// - client: `Client` object
147+ /// - database: `Database` object
148+ /// - packages: packages to be ingested
149+ /// - Returns: future
150+ static func ingest( client: Client ,
151+ database: Database ,
152+ packages: [ Joined < Package , Repository > ] ) async {
153+ Current . logger ( ) . debug ( " Ingesting \( packages. compactMap { $0. model. id} ) " )
154+ AppMetrics . ingestCandidatesCount? . set ( packages. count)
155+
156+ await withTaskGroup ( of: Void . self) { group in
157+ for pkg in packages {
158+ group. addTask {
159+ await ingest ( client: client, database: database, package : pkg)
160+ }
163161 }
164162 }
165163 }
166- }
167164
168165
169- extension Ingestion {
170166 static func ingest( client: Client , database: Database , package : Joined < Package , Repository > ) async {
171167 let result = await Result { ( ) async throws ( Ingestion . Error) - > Joined < Package , Repository > in
172168 @Dependency ( \. environment) var environment
0 commit comments