File size: 2,035 Bytes
b2806e8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
import { Processor, WorkerHost } from '@nestjs/bullmq';
import { Logger } from '@nestjs/common';
import { Job } from 'bullmq';
import { MarketsService } from './markets.service';
import { MarketCacheService } from './market-cache.service';

@Processor('market-processing')
export class MarketProcessor extends WorkerHost {
  private readonly logger = new Logger(MarketProcessor.name);

  constructor(
    private readonly marketsService: MarketsService,
    private readonly cacheService: MarketCacheService,
  ) {
    super();
  }

  async process(job: Job<{ slug: string }>): Promise<any> {
    const { slug } = job.data;
    this.logger.log(`Processing market: ${slug} (Job ${job.id})`);

    try {
      this.cacheService.setStatus(slug, 'processing');

      // Simulate heavy data fetching & integrity calculation
      // In production this would call real APIs
      await this.simulateWork(300);

      // Generate market detail (this does the heavy computation)
      const detail = this.marketsService.getMarketDetail(slug);

      if (!detail) {
        throw new Error(`Market ${slug} not found`);
      }

      // Calculate integrity score from the generated data
      const computedScore = this.marketsService.calculateIntegrityScore(detail, detail.oddsHistory);

      const enrichedDetail = {
        ...detail,
        integrityScore: computedScore,
        processedAt: new Date().toISOString(),
        jobId: job.id,
      };

      this.cacheService.setStatus(slug, 'ready', enrichedDetail);
      this.logger.log(`✓ Market ${slug} processed successfully (Score: ${computedScore.overall})`);

      return enrichedDetail;
    } catch (error) {
      const msg = error instanceof Error ? error.message : 'Unknown error';
      this.cacheService.setStatus(slug, 'error', undefined, msg);
      this.logger.error(`✗ Market ${slug} processing failed: ${msg}`);
      throw error;
    }
  }

  private simulateWork(ms: number): Promise<void> {
    return new Promise((resolve) => setTimeout(resolve, ms));
  }
}