forked from xnodeoncode/Aquiis
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathDatabaseService.cs
More file actions
144 lines (123 loc) · 4.98 KB
/
DatabaseService.cs
File metadata and controls
144 lines (123 loc) · 4.98 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
using Aquiis.Core.Interfaces.Services;
using Aquiis.Infrastructure.Data;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Logging;
namespace Aquiis.Application.Services;
/// <summary>
/// Service for managing database initialization and migrations.
/// Handles both business (ApplicationDbContext) and product-specific Identity contexts.
/// </summary>
public class DatabaseService : IDatabaseService
{
private readonly ApplicationDbContext _businessContext;
private readonly DbContext _identityContext; // Product-specific (SimpleStartDbContext or ProfessionalDbContext)
private readonly ILogger<DatabaseService> _logger;
public DatabaseService(
ApplicationDbContext businessContext,
DbContext identityContext,
ILogger<DatabaseService> logger)
{
_businessContext = businessContext;
_identityContext = identityContext;
_logger = logger;
}
public async Task InitializeAsync()
{
_logger.LogInformation("Checking for pending migrations...");
// Check and apply identity migrations first
var identityPending = await _identityContext.Database.GetPendingMigrationsAsync();
if (identityPending.Any())
{
_logger.LogInformation($"Applying {identityPending.Count()} identity migrations...");
await _identityContext.Database.MigrateAsync();
_logger.LogInformation("Identity migrations applied successfully.");
}
else
{
_logger.LogInformation("No pending identity migrations.");
}
// Then check and apply business migrations
var businessPending = await _businessContext.Database.GetPendingMigrationsAsync();
if (businessPending.Any())
{
_logger.LogInformation($"Applying {businessPending.Count()} business migrations...");
await _businessContext.Database.MigrateAsync();
_logger.LogInformation("Business migrations applied successfully.");
}
else
{
_logger.LogInformation("No pending business migrations.");
}
_logger.LogInformation("Database initialization complete.");
}
public async Task<bool> CanConnectAsync()
{
try
{
var businessCanConnect = await _businessContext.Database.CanConnectAsync();
var identityCanConnect = await _identityContext.Database.CanConnectAsync();
return businessCanConnect && identityCanConnect;
}
catch (Exception ex)
{
_logger.LogError(ex, "Failed to connect to database");
return false;
}
}
public async Task<int> GetPendingMigrationsCountAsync()
{
var pending = await _businessContext.Database.GetPendingMigrationsAsync();
_logger.LogInformation($"Business context has {pending.Count()} pending migrations.");
return pending.Count();
}
public async Task<int> GetIdentityPendingMigrationsCountAsync()
{
var pending = await _identityContext.Database.GetPendingMigrationsAsync();
_logger.LogInformation($"Identity context has {pending.Count()} pending migrations.");
return pending.Count();
}
/// <summary>
/// Gets the database settings (creates default if not exists)
/// </summary>
public async Task<Aquiis.Core.Entities.DatabaseSettings> GetDatabaseSettingsAsync()
{
var settings = await _businessContext.DatabaseSettings.FirstOrDefaultAsync();
if (settings == null)
{
// Create default settings
settings = new Aquiis.Core.Entities.DatabaseSettings
{
DatabaseEncryptionEnabled = false,
LastModifiedOn = DateTime.UtcNow,
LastModifiedBy = "System"
};
_businessContext.DatabaseSettings.Add(settings);
await _businessContext.SaveChangesAsync();
_logger.LogInformation("Created default database settings");
}
return settings;
}
/// <summary>
/// Updates database encryption status
/// </summary>
public async Task SetDatabaseEncryptionAsync(bool enabled, string modifiedBy = "System")
{
var settings = await GetDatabaseSettingsAsync();
settings.DatabaseEncryptionEnabled = enabled;
settings.EncryptionChangedOn = DateTime.UtcNow;
settings.LastModifiedOn = DateTime.UtcNow;
settings.LastModifiedBy = modifiedBy;
_businessContext.DatabaseSettings.Update(settings);
await _businessContext.SaveChangesAsync();
_logger.LogInformation("Database encryption {Status} by {ModifiedBy}",
enabled ? "enabled" : "disabled", modifiedBy);
}
/// <summary>
/// Gets current database encryption status
/// </summary>
public async Task<bool> IsDatabaseEncryptionEnabledAsync()
{
var settings = await GetDatabaseSettingsAsync();
return settings.DatabaseEncryptionEnabled;
}
}