fixed #1989 - installation on SQLite failing due to DropColumn, fixed #1986 - IClientStartup not getting called for External Modules, added ability to correlate new visitors by IP address

This commit is contained in:
Shaun Walker 2022-02-10 08:05:55 -05:00
parent ede6a45f15
commit 5aed64f614
14 changed files with 78 additions and 9 deletions

View File

@ -81,6 +81,15 @@ else
<input id="retention" class="form-control" @bind="@_retention" />
</div>
</div>
<div class="row mb-1 align-items-center">
<Label Class="col-sm-3" For="correlation" HelpText="Indicate if new visitors to this site should be correlated based on their IP Address" ResourceKey="Correlation">Correlate Visitors? </Label>
<div class="col-sm-9">
<select id="correlation" class="form-select" @bind="@_correlation">
<option value="true">@SharedLocalizer["True"]</option>
<option value="false">@SharedLocalizer["False"]</option>
</select>
</div>
</div>
</div>
<br />
<button type="button" class="btn btn-success" @onclick="SaveSiteSettings">@SharedLocalizer["Save"]</button>
@ -96,6 +105,7 @@ else
private string _tracking;
private string _filter = "";
private string _retention = "";
private string _correlation = "true";
public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Admin;
@ -120,6 +130,7 @@ else
var settings = await SettingService.GetSiteSettingsAsync(PageState.Site.SiteId);
_filter = SettingService.GetSetting(settings, "VisitorFilter", Constants.DefaultVisitorFilter);
_retention = SettingService.GetSetting(settings, "VisitorRetention", "30");
_correlation = SettingService.GetSetting(settings, "VisitorCorrelation", "true");
}
private async void TypeChanged(ChangeEventArgs e)
@ -170,6 +181,7 @@ else
var settings = await SettingService.GetSiteSettingsAsync(PageState.Site.SiteId);
settings = SettingService.SetSetting(settings, "VisitorFilter", _filter, true);
settings = SettingService.SetSetting(settings, "VisitorRetention", _retention, true);
settings = SettingService.SetSetting(settings, "VisitorCorrelation", _correlation, true);
await SettingService.UpdateSiteSettingsAsync(settings, PageState.Site.SiteId);
AddModuleMessage(Localizer["Success.SaveSiteSettings"], MessageType.Success);

View File

@ -186,4 +186,10 @@
<data name="Retention.Text" xml:space="preserve">
<value>Retention (Days):</value>
</data>
<data name="Correlation.HelpText" xml:space="preserve">
<value>Indicate if new visitors to this site should be correlated based on their IP Address</value>
</data>
<data name="Correlation.Text" xml:space="preserve">
<value>Correlate Visitors?</value>
</data>
</root>

View File

@ -30,6 +30,11 @@ namespace Oqtane.Database.Sqlite
return table.Column<int>(name: name, nullable: false).Annotation("Sqlite:Autoincrement", true);
}
public override void DropColumn(MigrationBuilder builder, string name, string table)
{
// not implemented as SQLite does not support dropping columns
}
public override string ConcatenateSql(params string[] values)
{
var returnValue = String.Empty;

View File

@ -1,6 +1,7 @@
using System;
using System.Data;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Migrations.Operations;
using Microsoft.EntityFrameworkCore.Migrations.Operations.Builders;
using Oqtane.Databases.Interfaces;
@ -75,6 +76,11 @@ namespace Oqtane.Databases
}
public virtual void DropColumn(MigrationBuilder builder, string name, string table)
{
builder.DropColumn(name, table);
}
public abstract DbContextOptionsBuilder UseDatabase(DbContextOptionsBuilder optionsBuilder, string connectionString);
}
}

View File

@ -1,5 +1,6 @@
using System.Data;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Migrations.Operations;
using Microsoft.EntityFrameworkCore.Migrations.Operations.Builders;
@ -31,6 +32,8 @@ namespace Oqtane.Databases.Interfaces
public void UpdateIdentityStoreTableNames(ModelBuilder builder);
public void DropColumn(MigrationBuilder builder, string name, string table);
public DbContextOptionsBuilder UseDatabase(DbContextOptionsBuilder optionsBuilder, string connectionString);
}
}

View File

@ -17,6 +17,7 @@ using Oqtane.Infrastructure;
using Oqtane.Modules;
using Oqtane.Repository;
using Oqtane.Security;
using Oqtane.Services;
using Oqtane.Shared;
namespace Microsoft.Extensions.DependencyInjection
@ -222,12 +223,15 @@ namespace Microsoft.Extensions.DependencyInjection
}
}
// register server startup services
var startUps = assembly.GetInstances<IServerStartup>();
foreach (var startup in startUps)
{
startup.ConfigureServices(services);
}
// dynamically register server startup services
assembly.GetInstances<IServerStartup>()
.ToList()
.ForEach(x => x.ConfigureServices(services));
// dynamically register client startup services (these services will only be used when running on Blazor Server)
assembly.GetInstances<IClientStartup>()
.ToList()
.ForEach(x => x.ConfigureServices(services));
}
return services;
}

View File

@ -1,12 +1,10 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.NetworkInformation;
using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Migrations.Operations;
using Microsoft.EntityFrameworkCore.Migrations.Operations.Builders;
using Oqtane.Databases.Interfaces;
using Oqtane.Interfaces;
// ReSharper disable BuiltInTypeReferenceStyleForMemberAccess
namespace Oqtane.Migrations.EntityBuilders
@ -126,7 +124,7 @@ namespace Oqtane.Migrations.EntityBuilders
public void DropColumn(string name)
{
_migrationBuilder.DropColumn(RewriteName(name), RewriteName(EntityTableName));
ActiveDatabase.DropColumn(_migrationBuilder, RewriteName(name), RewriteName(EntityTableName));
}

View File

@ -253,6 +253,35 @@ namespace Oqtane.Pages
var VisitorCookie = "APP_VISITOR_" + SiteId.ToString();
if (!int.TryParse(Request.Cookies[VisitorCookie], out VisitorId))
{
VisitorId = -1;
bool correlate = true;
setting = _settings.GetSetting(EntityNames.Site, SiteId, "VisitorCorrelation");
if (setting != null)
{
correlate = bool.Parse(setting.SettingValue);
}
if (correlate)
{
var visitor = _visitors.GetVisitor(SiteId, RemoteIPAddress);
if (visitor != null)
{
VisitorId = visitor.VisitorId;
Response.Cookies.Append(
VisitorCookie,
VisitorId.ToString(),
new CookieOptions()
{
Expires = DateTimeOffset.UtcNow.AddYears(1),
IsEssential = true
}
);
}
}
}
if (VisitorId == -1)
{
var visitor = new Visitor();
visitor.SiteId = SiteId;

View File

@ -10,6 +10,7 @@ namespace Oqtane.Repository
Visitor AddVisitor(Visitor visitor);
Visitor UpdateVisitor(Visitor visitor);
Visitor GetVisitor(int visitorId);
Visitor GetVisitor(int siteId, string IPAddress);
void DeleteVisitor(int visitorId);
int DeleteVisitors(int age);
}

View File

@ -41,6 +41,11 @@ namespace Oqtane.Repository
return _db.Visitor.Find(visitorId);
}
public Visitor GetVisitor(int siteId, string IPAddress)
{
return _db.Visitor.FirstOrDefault(item => item.SiteId == siteId && item.IPAddress == IPAddress);
}
public void DeleteVisitor(int visitorId)
{
Visitor visitor = _db.Visitor.Find(visitorId);