-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathProgram.cs
More file actions
120 lines (95 loc) · 3.3 KB
/
Copy pathProgram.cs
File metadata and controls
120 lines (95 loc) · 3.3 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
using JobFlowAutomation.Application.Abstractions;
using JobFlowAutomation.Application.Services;
using JobFlowAutomation.Configuration;
using JobFlowAutomation.Hosting.Workers;
using JobFlowAutomation.Infrastructure.FileSystem;
using JobFlowAutomation.Infrastructure.Persistence;
using JobFlowAutomation.Infrastructure.Seek;
using JobFlowAutomation.Infrastructure.Selenium;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using OpenQA.Selenium;
using Serilog;
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Information()
.Enrich.FromLogContext()
.WriteTo.Console()
.WriteTo.File(
"logs/JobFlowAutomation-.log",
rollingInterval: RollingInterval.Day)
.CreateLogger();
try
{
var builder = Host.CreateApplicationBuilder(args);
builder.Configuration.AddJsonFile(
"appsettings.Local.json",
optional: true,
reloadOnChange: false);
// Restore production-friendly precedence:
// environment variables and command-line values
// must override local JSON configuration.
builder.Configuration.AddEnvironmentVariables();
if (args.Length > 0)
{
builder.Configuration.AddCommandLine(args);
}
builder.Logging.ClearProviders();
builder.Logging.AddSerilog(Log.Logger, dispose: true);
builder.Services.Configure<SeekScraperOptions>(
builder.Configuration.GetSection(
SeekScraperOptions.ConfigurationSectionName));
builder.Services.AddCvSelectionOptions(
builder.Configuration);
builder.Services.AddSingleton<
ICvSelector,
CvSelector>();
builder.Services.AddSingleton<
ICvFileValidator,
CvFileValidator>();
builder.Services.AddTransient<
IApplicationPreparationService,
ApplicationPreparationService>();
var connectionString = builder.Configuration.GetConnectionString("JobFlowDatabase");
if (string.IsNullOrWhiteSpace(connectionString))
{
throw new InvalidOperationException(
"Connection string 'JobFlowDatabase' is missing.");
}
builder.Services.AddDbContextFactory<JobFlowDbContext>(options =>
options.UseNpgsql(connectionString));
builder.Services.AddSingleton(
TimeProvider.System);
builder.Services.AddSingleton<
IJobApplicationStore,
EfCoreJobApplicationStore>();
builder.Services.AddScoped<IWebDriver>(
_ => WebDriverFactory.Create());
builder.Services.AddScoped<SeleniumNavigator>();
builder.Services.AddScoped<
IJobScrapeStore,
EfCoreJobScrapeStore>();
builder.Services.AddTransient<SeekJobCardExtractor>();
builder.Services.AddTransient<SeekJobListPageExtractor>();
builder.Services.AddTransient<SeekJobDetailPageExtractor>();
builder.Services.AddTransient<IJobScraper, SeekScraper>();
builder.Services.AddScoped<
IJobScrapingWorkflow,
JobScrapingWorkflow>();
builder.Services.AddHostedService<JobScrapingWorker>();
using var host = builder.Build();
await host.RunAsync();
}
catch (Exception exception)
{
Log.Fatal(
exception,
"Application crashed unexpectedly");
Environment.ExitCode = 1;
}
finally
{
await Log.CloseAndFlushAsync();
}