Skip to content

Commit fa79570

Browse files
committed
Added analytics in backend
1 parent f6ce4c7 commit fa79570

File tree

13 files changed

+108
-1
lines changed

13 files changed

+108
-1
lines changed

LinkDotNet.Blog.Web/Pages/AboutMe.razor

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
@using LinkDotNet.Blog.Web.Shared.Skills
33
@inject AppConfiguration appConfiguration
44
@inject AuthenticationStateProvider authenticationStateProvider
5+
@inject IUserRecordService userRecordService
56
<OgData Title="@("About Me - " + appConfiguration.ProfileInformation.Name)"
67
Description="@("About Me," + appConfiguration.ProfileInformation.Name)"
78
Keywords="@appConfiguration.ProfileInformation.Name"
@@ -34,6 +35,7 @@
3435

3536
protected override async Task OnInitializedAsync()
3637
{
38+
await userRecordService.StoreUserRecordAsync();
3739
var userIdentity = (await authenticationStateProvider.GetAuthenticationStateAsync()).User.Identity;
3840
if (userIdentity != null)
3941
{
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
@page "/dashboard"
2+
@attribute [Authorize]
3+
4+
<div class="page">
5+
<h3>Dashboard</h3>
6+
<div class="container-fluid">
7+
<div class="row">
8+
<div class="col-auto">
9+
<div class="card px-3 py-3">
10+
<h5>Total amount of posts: </h5>
11+
<h5 style="text-align: center"> 12 </h5>
12+
</div>
13+
</div>
14+
</div>
15+
</div>
16+
</div>

LinkDotNet.Blog.Web/Pages/BlogPostPage.razor

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
@using Toolbelt.Blazor.HeadElement
77
@inject IRepository<BlogPost> blogPostRepository
88
@inject IJSRuntime jsRuntime
9+
@inject IUserRecordService userRecordService
910
@inherits MarkdownComponentBase
1011

1112
<div class="page">
@@ -55,6 +56,7 @@
5556

5657
protected override async Task OnInitializedAsync()
5758
{
59+
await userRecordService.StoreUserRecordAsync();
5860
BlogPost = await blogPostRepository.GetByIdAsync(BlogPostId);
5961
}
6062

LinkDotNet.Blog.Web/Pages/Index.razor

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
@inject IRepository<BlogPost> blogPostRepository
77
@inject AppConfiguration appConfiguration
88
@inject NavigationManager navigationManager
9+
@inject IUserRecordService userRecordService
910

1011
<OgData Title="@(Markdown.ToPlainText(appConfiguration.BlogName))"
1112
AbsolutePreviewImageUrl="@GetAbsolutePreviewImageUrl()"
@@ -34,6 +35,7 @@
3435

3536
protected override async Task OnInitializedAsync()
3637
{
38+
await userRecordService.StoreUserRecordAsync();
3739
currentPage = await blogPostRepository.GetAllAsync(
3840
p => p.IsPublished,
3941
b => b.UpdatedDate,

LinkDotNet.Blog.Web/Pages/Search.razor

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
@using LinkDotNet.Infrastructure.Persistence
33
@using LinkDotNet.Domain
44
@inject IRepository<BlogPost> blogPostRepository
5+
@inject IUserRecordService userRecordService
56

67
<div class="page">
78
<h3>Results for @SearchTerm</h3>
@@ -21,6 +22,7 @@
2122

2223
protected override async Task OnInitializedAsync()
2324
{
25+
await userRecordService.StoreUserRecordAsync();
2426
var term = Uri.UnescapeDataString(SearchTerm);
2527
blogPosts = (await blogPostRepository.GetAllAsync(t => t.IsPublished && (t.Title.Contains(term)
2628
|| t.Tags.Any(tag => tag.Content == term)),

LinkDotNet.Blog.Web/Pages/SearchByTag.razor

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
@using LinkDotNet.Infrastructure.Persistence
44
@using Toolbelt.Blazor.HeadElement
55
@inject IRepository<BlogPost> blogPostRepository
6+
@inject IUserRecordService userRecordService
67

78
<Title>Search for tag: @Tag</Title>
89

@@ -21,6 +22,7 @@
2122
IList<BlogPost> blogPosts = new List<BlogPost>();
2223
protected override async Task OnInitializedAsync()
2324
{
25+
await userRecordService.StoreUserRecordAsync();
2426
Tag = Uri.UnescapeDataString(Tag);
2527
blogPosts = (await blogPostRepository.GetAllAsync(
2628
b => b.Tags.Any(t => t.Content == Tag),

LinkDotNet.Blog.Web/Shared/AccessControl.razor

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@
1010
<li><a class="dropdown-item" href="create">Create new</a></li>
1111
<li><a class="dropdown-item" href="draft">Show drafts</a></li>
1212
<li><hr class="dropdown-divider"></li>
13+
<li><h6 class="dropdown-header">Analytics</h6></li>
14+
<li><a class="dropdown-item" href="dashboard">Dashboard</a></li>
15+
<li><hr class="dropdown-divider"></li>
1316
<li><a class="dropdown-item disabled" href="#">Version 1.7</a></li>
1417
</ul>
1518
</li>

LinkDotNet.Blog.Web/Shared/NavMenu.razor

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
<nav class="navbar navbar-expand-lg position-absolute navbar-background inverted-colors navbar-dark" style="width: 100%">
55
<div class="container-fluid">
6-
<a class="nav-brand barcode ms-5" href="#">@configuration.BlogName</a>
6+
<a class="nav-brand barcode ms-5" href="/">@configuration.BlogName</a>
77
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
88
<span class="navbar-toggler-icon"></span>
99
</button>
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
using System;
2+
using System.Threading.Tasks;
3+
using LinkDotNet.Domain;
4+
using LinkDotNet.Infrastructure.Persistence;
5+
using Microsoft.AspNetCore.Components;
6+
using Microsoft.AspNetCore.Http;
7+
8+
namespace LinkDotNet.Blog.Web.Shared
9+
{
10+
public interface IUserRecordService
11+
{
12+
Task StoreUserRecordAsync();
13+
}
14+
15+
public class UserRecordService : IUserRecordService
16+
{
17+
private readonly IRepository<UserRecord> userRecordRepository;
18+
private readonly IHttpContextAccessor httpContextAccessor;
19+
private readonly NavigationManager navigationManager;
20+
21+
public UserRecordService(
22+
IRepository<UserRecord> userRecordRepository,
23+
IHttpContextAccessor httpContextAccessor,
24+
NavigationManager navigationManager)
25+
{
26+
this.userRecordRepository = userRecordRepository;
27+
this.httpContextAccessor = httpContextAccessor;
28+
this.navigationManager = navigationManager;
29+
}
30+
31+
public async Task StoreUserRecordAsync()
32+
{
33+
var httpContext = httpContextAccessor.HttpContext;
34+
var ipHash = httpContext.Connection.RemoteIpAddress?.GetHashCode() ?? 0;
35+
36+
var record = new UserRecord
37+
{
38+
IpHash = ipHash,
39+
DateTimeUtcClicked = DateTime.UtcNow,
40+
UrlClicked = navigationManager.ToBaseRelativePath(navigationManager.Uri),
41+
};
42+
43+
await userRecordRepository.StoreAsync(record);
44+
}
45+
}
46+
}

LinkDotNet.Blog.Web/Startup.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ public void ConfigureServices(IServiceCollection services)
6262
services.AddBlazoredLocalStorage();
6363
services.AddHeadElementHelper();
6464
services.AddSingleton<ISortOrderCalculator, SortOrderCalculator>();
65+
services.AddScoped<IUserRecordService, UserRecordService>();
6566
}
6667

6768
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)

0 commit comments

Comments
 (0)