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:
parent
ede6a45f15
commit
5aed64f614
|
@ -81,6 +81,15 @@ else
|
||||||
<input id="retention" class="form-control" @bind="@_retention" />
|
<input id="retention" class="form-control" @bind="@_retention" />
|
||||||
</div>
|
</div>
|
||||||
</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>
|
</div>
|
||||||
<br />
|
<br />
|
||||||
<button type="button" class="btn btn-success" @onclick="SaveSiteSettings">@SharedLocalizer["Save"]</button>
|
<button type="button" class="btn btn-success" @onclick="SaveSiteSettings">@SharedLocalizer["Save"]</button>
|
||||||
|
@ -96,6 +105,7 @@ else
|
||||||
private string _tracking;
|
private string _tracking;
|
||||||
private string _filter = "";
|
private string _filter = "";
|
||||||
private string _retention = "";
|
private string _retention = "";
|
||||||
|
private string _correlation = "true";
|
||||||
|
|
||||||
public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Admin;
|
public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Admin;
|
||||||
|
|
||||||
|
@ -120,6 +130,7 @@ else
|
||||||
var settings = await SettingService.GetSiteSettingsAsync(PageState.Site.SiteId);
|
var settings = await SettingService.GetSiteSettingsAsync(PageState.Site.SiteId);
|
||||||
_filter = SettingService.GetSetting(settings, "VisitorFilter", Constants.DefaultVisitorFilter);
|
_filter = SettingService.GetSetting(settings, "VisitorFilter", Constants.DefaultVisitorFilter);
|
||||||
_retention = SettingService.GetSetting(settings, "VisitorRetention", "30");
|
_retention = SettingService.GetSetting(settings, "VisitorRetention", "30");
|
||||||
|
_correlation = SettingService.GetSetting(settings, "VisitorCorrelation", "true");
|
||||||
}
|
}
|
||||||
|
|
||||||
private async void TypeChanged(ChangeEventArgs e)
|
private async void TypeChanged(ChangeEventArgs e)
|
||||||
|
@ -170,6 +181,7 @@ else
|
||||||
var settings = await SettingService.GetSiteSettingsAsync(PageState.Site.SiteId);
|
var settings = await SettingService.GetSiteSettingsAsync(PageState.Site.SiteId);
|
||||||
settings = SettingService.SetSetting(settings, "VisitorFilter", _filter, true);
|
settings = SettingService.SetSetting(settings, "VisitorFilter", _filter, true);
|
||||||
settings = SettingService.SetSetting(settings, "VisitorRetention", _retention, true);
|
settings = SettingService.SetSetting(settings, "VisitorRetention", _retention, true);
|
||||||
|
settings = SettingService.SetSetting(settings, "VisitorCorrelation", _correlation, true);
|
||||||
await SettingService.UpdateSiteSettingsAsync(settings, PageState.Site.SiteId);
|
await SettingService.UpdateSiteSettingsAsync(settings, PageState.Site.SiteId);
|
||||||
|
|
||||||
AddModuleMessage(Localizer["Success.SaveSiteSettings"], MessageType.Success);
|
AddModuleMessage(Localizer["Success.SaveSiteSettings"], MessageType.Success);
|
||||||
|
|
|
@ -186,4 +186,10 @@
|
||||||
<data name="Retention.Text" xml:space="preserve">
|
<data name="Retention.Text" xml:space="preserve">
|
||||||
<value>Retention (Days):</value>
|
<value>Retention (Days):</value>
|
||||||
</data>
|
</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>
|
</root>
|
|
@ -30,6 +30,11 @@ namespace Oqtane.Database.Sqlite
|
||||||
return table.Column<int>(name: name, nullable: false).Annotation("Sqlite:Autoincrement", true);
|
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)
|
public override string ConcatenateSql(params string[] values)
|
||||||
{
|
{
|
||||||
var returnValue = String.Empty;
|
var returnValue = String.Empty;
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
using System;
|
using System;
|
||||||
using System.Data;
|
using System.Data;
|
||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.EntityFrameworkCore;
|
||||||
|
using Microsoft.EntityFrameworkCore.Migrations;
|
||||||
using Microsoft.EntityFrameworkCore.Migrations.Operations;
|
using Microsoft.EntityFrameworkCore.Migrations.Operations;
|
||||||
using Microsoft.EntityFrameworkCore.Migrations.Operations.Builders;
|
using Microsoft.EntityFrameworkCore.Migrations.Operations.Builders;
|
||||||
using Oqtane.Databases.Interfaces;
|
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);
|
public abstract DbContextOptionsBuilder UseDatabase(DbContextOptionsBuilder optionsBuilder, string connectionString);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
using System.Data;
|
using System.Data;
|
||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.EntityFrameworkCore;
|
||||||
|
using Microsoft.EntityFrameworkCore.Migrations;
|
||||||
using Microsoft.EntityFrameworkCore.Migrations.Operations;
|
using Microsoft.EntityFrameworkCore.Migrations.Operations;
|
||||||
using Microsoft.EntityFrameworkCore.Migrations.Operations.Builders;
|
using Microsoft.EntityFrameworkCore.Migrations.Operations.Builders;
|
||||||
|
|
||||||
|
@ -31,6 +32,8 @@ namespace Oqtane.Databases.Interfaces
|
||||||
|
|
||||||
public void UpdateIdentityStoreTableNames(ModelBuilder builder);
|
public void UpdateIdentityStoreTableNames(ModelBuilder builder);
|
||||||
|
|
||||||
|
public void DropColumn(MigrationBuilder builder, string name, string table);
|
||||||
|
|
||||||
public DbContextOptionsBuilder UseDatabase(DbContextOptionsBuilder optionsBuilder, string connectionString);
|
public DbContextOptionsBuilder UseDatabase(DbContextOptionsBuilder optionsBuilder, string connectionString);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,6 +17,7 @@ using Oqtane.Infrastructure;
|
||||||
using Oqtane.Modules;
|
using Oqtane.Modules;
|
||||||
using Oqtane.Repository;
|
using Oqtane.Repository;
|
||||||
using Oqtane.Security;
|
using Oqtane.Security;
|
||||||
|
using Oqtane.Services;
|
||||||
using Oqtane.Shared;
|
using Oqtane.Shared;
|
||||||
|
|
||||||
namespace Microsoft.Extensions.DependencyInjection
|
namespace Microsoft.Extensions.DependencyInjection
|
||||||
|
@ -222,12 +223,15 @@ namespace Microsoft.Extensions.DependencyInjection
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// register server startup services
|
// dynamically register server startup services
|
||||||
var startUps = assembly.GetInstances<IServerStartup>();
|
assembly.GetInstances<IServerStartup>()
|
||||||
foreach (var startup in startUps)
|
.ToList()
|
||||||
{
|
.ForEach(x => x.ConfigureServices(services));
|
||||||
startup.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;
|
return services;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,12 +1,10 @@
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Net.NetworkInformation;
|
|
||||||
using Microsoft.EntityFrameworkCore.Migrations;
|
using Microsoft.EntityFrameworkCore.Migrations;
|
||||||
using Microsoft.EntityFrameworkCore.Migrations.Operations;
|
using Microsoft.EntityFrameworkCore.Migrations.Operations;
|
||||||
using Microsoft.EntityFrameworkCore.Migrations.Operations.Builders;
|
using Microsoft.EntityFrameworkCore.Migrations.Operations.Builders;
|
||||||
using Oqtane.Databases.Interfaces;
|
using Oqtane.Databases.Interfaces;
|
||||||
using Oqtane.Interfaces;
|
|
||||||
// ReSharper disable BuiltInTypeReferenceStyleForMemberAccess
|
// ReSharper disable BuiltInTypeReferenceStyleForMemberAccess
|
||||||
|
|
||||||
namespace Oqtane.Migrations.EntityBuilders
|
namespace Oqtane.Migrations.EntityBuilders
|
||||||
|
@ -126,7 +124,7 @@ namespace Oqtane.Migrations.EntityBuilders
|
||||||
|
|
||||||
public void DropColumn(string name)
|
public void DropColumn(string name)
|
||||||
{
|
{
|
||||||
_migrationBuilder.DropColumn(RewriteName(name), RewriteName(EntityTableName));
|
ActiveDatabase.DropColumn(_migrationBuilder, RewriteName(name), RewriteName(EntityTableName));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -253,6 +253,35 @@ namespace Oqtane.Pages
|
||||||
|
|
||||||
var VisitorCookie = "APP_VISITOR_" + SiteId.ToString();
|
var VisitorCookie = "APP_VISITOR_" + SiteId.ToString();
|
||||||
if (!int.TryParse(Request.Cookies[VisitorCookie], out VisitorId))
|
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();
|
var visitor = new Visitor();
|
||||||
visitor.SiteId = SiteId;
|
visitor.SiteId = SiteId;
|
||||||
|
|
|
@ -10,6 +10,7 @@ namespace Oqtane.Repository
|
||||||
Visitor AddVisitor(Visitor visitor);
|
Visitor AddVisitor(Visitor visitor);
|
||||||
Visitor UpdateVisitor(Visitor visitor);
|
Visitor UpdateVisitor(Visitor visitor);
|
||||||
Visitor GetVisitor(int visitorId);
|
Visitor GetVisitor(int visitorId);
|
||||||
|
Visitor GetVisitor(int siteId, string IPAddress);
|
||||||
void DeleteVisitor(int visitorId);
|
void DeleteVisitor(int visitorId);
|
||||||
int DeleteVisitors(int age);
|
int DeleteVisitors(int age);
|
||||||
}
|
}
|
||||||
|
|
|
@ -41,6 +41,11 @@ namespace Oqtane.Repository
|
||||||
return _db.Visitor.Find(visitorId);
|
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)
|
public void DeleteVisitor(int visitorId)
|
||||||
{
|
{
|
||||||
Visitor visitor = _db.Visitor.Find(visitorId);
|
Visitor visitor = _db.Visitor.Find(visitorId);
|
||||||
|
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Loading…
Reference in New Issue
Block a user