-
Notifications
You must be signed in to change notification settings - Fork 4
Expand file tree
/
Copy pathsharedDependencies.service.ts
More file actions
156 lines (141 loc) · 5.43 KB
/
sharedDependencies.service.ts
File metadata and controls
156 lines (141 loc) · 5.43 KB
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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
import { CoreDependencies } from "@grants-stack-indexer/data-flow";
import { EnvioIndexerClient } from "@grants-stack-indexer/indexer-client";
import { CachingMetadataProvider, MetadataProviderFactory } from "@grants-stack-indexer/metadata";
import { CachingPricingProvider, PricingProviderFactory } from "@grants-stack-indexer/pricing";
import {
createKyselyDatabase,
IEventRegistryRepository,
InMemoryMetadataCache,
InMemoryPricingCache,
IStrategyProcessingCheckpointRepository,
IStrategyRegistryRepository,
KyselyApplicationPayoutRepository,
KyselyApplicationRepository,
KyselyDonationRepository,
KyselyEventRegistryRepository,
KyselyMetadataCache,
KyselyPricingCache,
KyselyProjectRepository,
KyselyRoundRepository,
KyselyStrategyProcessingCheckpointRepository,
KyselyStrategyRegistryRepository,
KyselyTransactionManager,
} from "@grants-stack-indexer/repository";
import { ExponentialBackoff, ILogger, Logger, RetryStrategy } from "@grants-stack-indexer/shared";
import { Environment } from "../config/index.js";
export type SharedDependencies = {
core: Omit<CoreDependencies, "evmProvider">;
registriesRepositories: {
eventRegistryRepository: IEventRegistryRepository;
strategyRegistryRepository: IStrategyRegistryRepository;
strategyProcessingCheckpointRepository: IStrategyProcessingCheckpointRepository;
};
indexerClient: EnvioIndexerClient;
kyselyDatabase: ReturnType<typeof createKyselyDatabase>;
retryStrategy: RetryStrategy;
logger: ILogger;
};
/**
* Shared dependencies service
* - Initializes core dependencies (repositories, providers)
* - Initializes registries repositories
* - Initializes indexer client
*/
export class SharedDependenciesService {
static async initialize(env: Environment): Promise<SharedDependencies> {
const logger = Logger.getInstance();
// Initialize repositories
const kyselyDatabase = createKyselyDatabase(
{
connectionString: env.DATABASE_URL,
isProduction: env.NODE_ENV === "production" || env.NODE_ENV === "staging",
},
logger,
);
const transactionManager = new KyselyTransactionManager(kyselyDatabase);
const projectRepository = new KyselyProjectRepository(kyselyDatabase, env.DATABASE_SCHEMA);
const roundRepository = new KyselyRoundRepository(kyselyDatabase, env.DATABASE_SCHEMA);
const applicationRepository = new KyselyApplicationRepository(
kyselyDatabase,
env.DATABASE_SCHEMA,
);
const donationRepository = new KyselyDonationRepository(
kyselyDatabase,
env.DATABASE_SCHEMA,
);
const applicationPayoutRepository = new KyselyApplicationPayoutRepository(
kyselyDatabase,
env.DATABASE_SCHEMA,
);
const pricingRepository = new KyselyPricingCache(kyselyDatabase, env.DATABASE_SCHEMA);
const internalPricingProvider = PricingProviderFactory.create(env, {
logger,
});
const dbCachedPricingProvider = new CachingPricingProvider(
internalPricingProvider,
pricingRepository,
logger,
);
const pricingProvider = new CachingPricingProvider(
dbCachedPricingProvider,
new InMemoryPricingCache(),
logger,
);
const metadataRepository = new KyselyMetadataCache(kyselyDatabase, env.DATABASE_SCHEMA);
const internalMetadataProvider = MetadataProviderFactory.create(env, {
logger,
});
const dbCachedMetadataProvider = new CachingMetadataProvider(
internalMetadataProvider,
metadataRepository,
logger,
);
const metadataProvider = new CachingMetadataProvider(
dbCachedMetadataProvider,
new InMemoryMetadataCache(),
logger,
);
const eventRegistryRepository = new KyselyEventRegistryRepository(
kyselyDatabase,
env.DATABASE_SCHEMA,
);
const strategyRegistryRepository = new KyselyStrategyRegistryRepository(
kyselyDatabase,
env.DATABASE_SCHEMA,
);
const strategyProcessingCheckpointRepository =
new KyselyStrategyProcessingCheckpointRepository(kyselyDatabase, env.DATABASE_SCHEMA);
// Initialize indexer client
const indexerClient = new EnvioIndexerClient(
env.INDEXER_GRAPHQL_URL,
env.INDEXER_ADMIN_SECRET,
);
const retryStrategy = new ExponentialBackoff({
maxAttempts: env.RETRY_MAX_ATTEMPTS,
baseDelay: env.RETRY_BASE_DELAY_MS,
maxDelay: env.RETRY_MAX_DELAY_MS,
factor: env.RETRY_FACTOR,
});
return {
core: {
projectRepository,
roundRepository,
applicationRepository,
pricingProvider,
donationRepository,
metadataProvider,
applicationPayoutRepository,
transactionManager,
},
registriesRepositories: {
eventRegistryRepository,
strategyRegistryRepository,
strategyProcessingCheckpointRepository,
},
indexerClient,
kyselyDatabase,
retryStrategy,
logger,
};
}
}