This commit is contained in:
Laura Hausmann 2022-12-15 22:36:15 +01:00
parent ba569ac388
commit 32f191f7e3
Signed by: zotan
GPG Key ID: D044E84C5BE01605
24 changed files with 102 additions and 96 deletions

View File

@ -3,11 +3,11 @@ using System.Linq;
using LinqToDB; using LinqToDB;
using LinqToDB.Configuration; using LinqToDB.Configuration;
using LinqToDB.Data; using LinqToDB.Data;
using RTMPDash.DataModels.Tables; using RTMPDash.Backend.Database.Tables;
namespace RTMPDash.DataModels; namespace RTMPDash.Backend.Database;
public class AppDb { public class Database {
public class ConnectionStringSettings : IConnectionStringSettings { public class ConnectionStringSettings : IConnectionStringSettings {
public string ConnectionString { get; set; } public string ConnectionString { get; set; }
public string Name { get; set; } public string Name { get; set; }

View File

@ -1,6 +1,6 @@
using LinqToDB.Mapping; using LinqToDB.Mapping;
namespace RTMPDash.DataModels.Tables; namespace RTMPDash.Backend.Database.Tables;
[Table(Name = "DbInfo")] [Table(Name = "DbInfo")]
public class DbInfo { public class DbInfo {

View File

@ -1,8 +1,8 @@
using LinqToDB.Mapping; using LinqToDB.Mapping;
namespace RTMPDash.DataModels.Tables; namespace RTMPDash.Backend.Database.Tables;
[Table(Name = "Invites")] [Table(Name = "Invites")]
public class Invite { public class Invite {
[Column(Name = "Code"), PrimaryKey, NotNull] public string Code { get; set; } [Column(Name = "Code"), PrimaryKey, NotNull] public string Code { get; set; }
} }

View File

@ -1,6 +1,6 @@
using LinqToDB.Mapping; using LinqToDB.Mapping;
namespace RTMPDash.DataModels.Tables; namespace RTMPDash.Backend.Database.Tables;
[Table(Name = "Users")] [Table(Name = "Users")]
public class User { public class User {

View File

@ -3,11 +3,10 @@ using System.Collections.Generic;
using System.Linq; using System.Linq;
using LinqToDB; using LinqToDB;
using LinqToDB.Data; using LinqToDB.Data;
using RTMPDash.DataModels; using RTMPDash.Backend.Database.Tables;
using RTMPDash.DataModels.Tables;
using RTMPDash.Pages; using RTMPDash.Pages;
namespace RTMPDash; namespace RTMPDash.Backend;
public static class Migrations { public static class Migrations {
private const int DbVer = 2; private const int DbVer = 2;
@ -20,7 +19,7 @@ public static class Migrations {
}; };
public static void RunMigrations() { public static void RunMigrations() {
using var db = new AppDb.DbConn(); using var db = new Database.Database.DbConn();
var ccolor = Console.ForegroundColor; var ccolor = Console.ForegroundColor;
if (!db.DataProvider.GetSchemaProvider().GetSchema(db).Tables.Any()) { if (!db.DataProvider.GetSchemaProvider().GetSchema(db).Tables.Any()) {
@ -82,7 +81,7 @@ public static class Migrations {
new Migration(0, "COMMIT TRANSACTION").Run(db); new Migration(0, "COMMIT TRANSACTION").Run(db);
var newdb = new AppDb.DbConn(); var newdb = new Database.Database.DbConn();
var dbinfo = newdb.DbInfo.First(); var dbinfo = newdb.DbInfo.First();
dbinfo.DbVer = DbVer; dbinfo.DbVer = DbVer;
newdb.Update(dbinfo); newdb.Update(dbinfo);

View File

@ -3,9 +3,8 @@ using System.Threading;
using LinqToDB.Data; using LinqToDB.Data;
using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Hosting;
using RTMPDash.DataModels;
namespace RTMPDash; namespace RTMPDash.Backend;
public class Program { public class Program {
public const string SiteName = "chaos.stream"; public const string SiteName = "chaos.stream";
@ -25,7 +24,7 @@ public class Program {
"<a href=\"https://t.me/zotan\" target=\"_blank\">Telegram</a>, <a href=\"https://threema.id/S59S9U8J\" target=\"_blank\">Threema</a>, or via <a href=\"mailto:chaosstream-contact@zotan.email\" target=\"_blank\">email</a>."; "<a href=\"https://t.me/zotan\" target=\"_blank\">Telegram</a>, <a href=\"https://threema.id/S59S9U8J\" target=\"_blank\">Threema</a>, or via <a href=\"mailto:chaosstream-contact@zotan.email\" target=\"_blank\">email</a>.";
public static void Main(string[] args) { public static void Main(string[] args) {
DataConnection.DefaultSettings = new AppDb.Settings(); DataConnection.DefaultSettings = new Database.Database.Settings();
ThreadPool.SetMinThreads(100, 100); ThreadPool.SetMinThreads(100, 100);
Migrations.RunMigrations(); Migrations.RunMigrations();
CreateHostBuilder(args).Build().Run(); CreateHostBuilder(args).Build().Run();

View File

@ -5,7 +5,7 @@ using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Hosting;
namespace RTMPDash; namespace RTMPDash.Backend;
public class Startup { public class Startup {
public Startup(IConfiguration configuration) => Configuration = configuration; public Startup(IConfiguration configuration) => Configuration = configuration;
@ -62,4 +62,4 @@ public class Startup {
endpoints.MapControllers(); endpoints.MapControllers();
}); });
} }
} }

View File

@ -2,9 +2,8 @@ using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Net; using System.Net;
using System.Xml.Serialization; using System.Xml.Serialization;
using RTMPDash.DataModels;
namespace RTMPDash; namespace RTMPDash.Backend;
public static class StreamUtils { public static class StreamUtils {
private static readonly XmlSerializer Serializer = new(typeof(StatsObject)); private static readonly XmlSerializer Serializer = new(typeof(StatsObject));
@ -19,7 +18,7 @@ public static class StreamUtils {
long.Parse(stats.Server.Applications.First(p => p.Name == "ingress").MethodLive.Streams.First(p => p.Name == user).Time); long.Parse(stats.Server.Applications.First(p => p.Name == "ingress").MethodLive.Streams.First(p => p.Name == user).Time);
public static int CountLiveRestreams(string user, StatsObject stats) { public static int CountLiveRestreams(string user, StatsObject stats) {
var db = new AppDb.DbConn(); var db = new Database.Database.DbConn();
var dbUser = db.Users.First(p => p.Username == user); var dbUser = db.Users.First(p => p.Username == user);
return dbUser.RestreamTargets.Split(",") return dbUser.RestreamTargets.Split(",")
.Count(target => stats.Server.Applications.First(p => p.Name == "ingress") .Count(target => stats.Server.Applications.First(p => p.Name == "ingress")
@ -27,7 +26,7 @@ public static class StreamUtils {
} }
public static int CountLiveRestreams(string user, string privateAccesskey, StatsObject stats) { public static int CountLiveRestreams(string user, string privateAccesskey, StatsObject stats) {
var db = new AppDb.DbConn(); var db = new Database.Database.DbConn();
var dbUser = db.Users.First(p => p.Username == user); var dbUser = db.Users.First(p => p.Username == user);
return dbUser.RestreamTargets.Split(",") return dbUser.RestreamTargets.Split(",")
.Count(target => stats.Server.Applications.First(p => p.Name == "ingress") .Count(target => stats.Server.Applications.First(p => p.Name == "ingress")

View File

@ -1,6 +1,6 @@
using System.Linq; using System.Linq;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using RTMPDash.DataModels; using RTMPDash.Backend.Database;
namespace RTMPDash.Controllers; namespace RTMPDash.Controllers;
@ -8,7 +8,7 @@ namespace RTMPDash.Controllers;
public class RtmpAuthController : ControllerBase { public class RtmpAuthController : ControllerBase {
[HttpGet] [HttpGet]
public string Get() { public string Get() {
var db = new AppDb.DbConn(); var db = new Database.DbConn();
if (!db.Users.Any(p => p.StreamKey == Request.Query["name"])) { if (!db.Users.Any(p => p.StreamKey == Request.Query["name"])) {
Response.StatusCode = 403; Response.StatusCode = 403;
return "unauthorized"; return "unauthorized";

View File

@ -2,14 +2,15 @@
@inject IAntiforgery Antiforgery @inject IAntiforgery Antiforgery
@using Microsoft.AspNetCore.Antiforgery @using Microsoft.AspNetCore.Antiforgery
@using Microsoft.AspNetCore.Http @using Microsoft.AspNetCore.Http
@using RTMPDash.DataModels @using RTMPDash.Backend
@using RTMPDash.Backend.Database
@model AdminModel @model AdminModel
@{ @{
ViewData["Title"] = "Admin"; ViewData["Title"] = "Admin";
var db = new AppDb.DbConn(); var db = new Database.DbConn();
var tokenSet = Antiforgery.GetAndStoreTokens(HttpContext); var tokenSet = Antiforgery.GetAndStoreTokens(HttpContext);
if (string.IsNullOrEmpty(HttpContext.Session.GetString("authenticatedUser")) || !new AppDb.DbConn().Users.First(p => p.Username == HttpContext.Session.GetString("authenticatedUser")).IsAdmin) { if (string.IsNullOrEmpty(HttpContext.Session.GetString("authenticatedUser")) || !new Database.DbConn().Users.First(p => p.Username == HttpContext.Session.GetString("authenticatedUser")).IsAdmin) {
Response.Redirect("/"); Response.Redirect("/");
return; return;
} }

View File

@ -3,8 +3,8 @@ using System.Linq;
using LinqToDB; using LinqToDB;
using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc.RazorPages; using Microsoft.AspNetCore.Mvc.RazorPages;
using RTMPDash.DataModels; using RTMPDash.Backend.Database;
using RTMPDash.DataModels.Tables; using RTMPDash.Backend.Database.Tables;
namespace RTMPDash.Pages; namespace RTMPDash.Pages;
@ -13,13 +13,13 @@ public class AdminModel : PageModel {
public void OnPost() { public void OnPost() {
if (string.IsNullOrEmpty(HttpContext.Session.GetString("authenticatedUser")) if (string.IsNullOrEmpty(HttpContext.Session.GetString("authenticatedUser"))
|| !new AppDb.DbConn().Users.First(p => p.Username == HttpContext.Session.GetString("authenticatedUser")).IsAdmin) || !new Database.DbConn().Users.First(p => p.Username == HttpContext.Session.GetString("authenticatedUser")).IsAdmin)
return; return;
if (!Request.HasFormContentType || string.IsNullOrWhiteSpace(Request.Form["action"])) if (!Request.HasFormContentType || string.IsNullOrWhiteSpace(Request.Form["action"]))
return; return;
var db = new AppDb.DbConn(); var db = new Database.DbConn();
if (Request.Form["action"] == "invite_generate") if (Request.Form["action"] == "invite_generate")
db.Insert(new Invite { Code = Guid.NewGuid().ToString() }); db.Insert(new Invite { Code = Guid.NewGuid().ToString() });

View File

@ -1,4 +1,5 @@
@page @page
@using RTMPDash.Backend
@model ContentModel @model ContentModel
@{ @{
ViewData["Title"] = "Content Policy"; ViewData["Title"] = "Content Policy";

View File

@ -1,4 +1,5 @@
@page @page
@using RTMPDash.Backend
@model CreditsModel @model CreditsModel
@{ @{
ViewData["Title"] = "Credits"; ViewData["Title"] = "Credits";

View File

@ -2,7 +2,8 @@
@inject IAntiforgery _antiforgery @inject IAntiforgery _antiforgery
@using Microsoft.AspNetCore.Antiforgery @using Microsoft.AspNetCore.Antiforgery
@using Microsoft.AspNetCore.Http @using Microsoft.AspNetCore.Http
@using RTMPDash.DataModels @using RTMPDash.Backend
@using RTMPDash.Backend.Database
@model DashboardModel @model DashboardModel
@{ @{
ViewData["Title"] = "Dashboard"; ViewData["Title"] = "Dashboard";
@ -16,7 +17,7 @@
</div> </div>
} }
else { else {
var db = new AppDb.DbConn(); var db = new Database.DbConn();
var user = db.Users.First(p => p.Username == HttpContext.Session.GetString("authenticatedUser")); var user = db.Users.First(p => p.Username == HttpContext.Session.GetString("authenticatedUser"));
var stats = StreamUtils.GetStatsObject(); var stats = StreamUtils.GetStatsObject();
<div class="alert alert-success" role="alert"> <div class="alert alert-success" role="alert">

View File

@ -3,7 +3,7 @@ using System.Linq;
using LinqToDB; using LinqToDB;
using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc.RazorPages; using Microsoft.AspNetCore.Mvc.RazorPages;
using RTMPDash.DataModels; using RTMPDash.Backend.Database;
namespace RTMPDash.Pages; namespace RTMPDash.Pages;
@ -14,7 +14,7 @@ public class DashboardModel : PageModel {
if (!Request.HasFormContentType || string.IsNullOrWhiteSpace(Request.Form["action"]) || string.IsNullOrWhiteSpace(HttpContext.Session.GetString("authenticatedUser"))) if (!Request.HasFormContentType || string.IsNullOrWhiteSpace(Request.Form["action"]) || string.IsNullOrWhiteSpace(HttpContext.Session.GetString("authenticatedUser")))
return; return;
using var db = new AppDb.DbConn(); using var db = new Database.DbConn();
var user = db.Users.FirstOrDefault(p => p.Username == HttpContext.Session.GetString("authenticatedUser")); var user = db.Users.FirstOrDefault(p => p.Username == HttpContext.Session.GetString("authenticatedUser"));
if (Request.Form["action"] == "password_change") { if (Request.Form["action"] == "password_change") {
@ -69,14 +69,12 @@ public class DashboardModel : PageModel {
} }
if (Request.Form["action"] == "pronoun_plural") { if (Request.Form["action"] == "pronoun_plural") {
var target = string.IsNullOrWhiteSpace(Request.Form["value"]) ? "their" : Request.Form["value"].ToString();
user!.PronounPlural = true; user!.PronounPlural = true;
db.Update(user); db.Update(user);
Response.Redirect("/Dashboard"); Response.Redirect("/Dashboard");
} }
if (Request.Form["action"] == "pronoun_singular") { if (Request.Form["action"] == "pronoun_singular") {
var target = string.IsNullOrWhiteSpace(Request.Form["value"]) ? "their" : Request.Form["value"].ToString();
user!.PronounPlural = false; user!.PronounPlural = false;
db.Update(user); db.Update(user);
Response.Redirect("/Dashboard"); Response.Redirect("/Dashboard");

View File

@ -1,9 +1,10 @@
@page @page
@using RTMPDash.DataModels @using RTMPDash.Backend.Database
@using RTMPDash.Backend
@model IndexModel @model IndexModel
@{ @{
ViewData["Title"] = "Home"; ViewData["Title"] = "Home";
var db = new AppDb.DbConn(); var db = new Database.DbConn();
var allStreams = StreamUtils.ListLiveUsers(); var allStreams = StreamUtils.ListLiveUsers();
var allUsers = db.Users.Where(p => !p.IsPrivate).Select(p => p.Username); var allUsers = db.Users.Where(p => !p.IsPrivate).Select(p => p.Username);
var liveUsers = allStreams.Intersect(allUsers); var liveUsers = allStreams.Intersect(allUsers);

View File

@ -6,7 +6,7 @@ using System.Text;
using System.Web; using System.Web;
using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc.RazorPages; using Microsoft.AspNetCore.Mvc.RazorPages;
using RTMPDash.DataModels; using RTMPDash.Backend.Database;
namespace RTMPDash.Pages; namespace RTMPDash.Pages;
@ -15,7 +15,7 @@ public class LoginModel : PageModel {
if (!Request.HasFormContentType || string.IsNullOrWhiteSpace(Request.Form["user"]) || string.IsNullOrWhiteSpace(Request.Form["pass"])) if (!Request.HasFormContentType || string.IsNullOrWhiteSpace(Request.Form["user"]) || string.IsNullOrWhiteSpace(Request.Form["pass"]))
return; return;
using var db = new AppDb.DbConn(); using var db = new Database.DbConn();
var user = db.Users.FirstOrDefault(p => p.Username == Request.Form["user"].ToString()); var user = db.Users.FirstOrDefault(p => p.Username == Request.Form["user"].ToString());
if (user == null) if (user == null)

View File

@ -1,4 +1,5 @@
@page @page
@using RTMPDash.Backend
@model PrivacyModel @model PrivacyModel
@{ @{
ViewData["Title"] = "Privacy Policy"; ViewData["Title"] = "Privacy Policy";

View File

@ -1,9 +1,10 @@
@page "/{user}" @page "/{user}"
@using RTMPDash.DataModels @using RTMPDash.Backend.Database
@using RTMPDash.Backend
@model ProfileModel @model ProfileModel
@{ @{
ViewData["Title"] = Model.User; ViewData["Title"] = Model.User;
var db = new AppDb.DbConn(); var db = new Database.DbConn();
if (!db.Users.Any(p => p.Username == Model.User)) { if (!db.Users.Any(p => p.Username == Model.User)) {
Response.Redirect("/"); Response.Redirect("/");
return; return;

View File

@ -3,8 +3,8 @@ using System.Linq;
using LinqToDB; using LinqToDB;
using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc.RazorPages; using Microsoft.AspNetCore.Mvc.RazorPages;
using RTMPDash.DataModels; using RTMPDash.Backend.Database;
using RTMPDash.DataModels.Tables; using RTMPDash.Backend.Database.Tables;
namespace RTMPDash.Pages; namespace RTMPDash.Pages;
@ -16,7 +16,7 @@ public class RegisterModel : PageModel {
|| string.IsNullOrWhiteSpace(Request.Form["code"])) || string.IsNullOrWhiteSpace(Request.Form["code"]))
return; return;
using var db = new AppDb.DbConn(); using var db = new Database.DbConn();
if (!db.Invites.Any(p => p.Code == Request.Form["code"])) if (!db.Invites.Any(p => p.Code == Request.Form["code"]))
return; return;

View File

@ -1,5 +1,6 @@
@using Microsoft.AspNetCore.Http @using Microsoft.AspNetCore.Http
@using RTMPDash.DataModels @using RTMPDash.Backend
@using RTMPDash.Backend.Database
<!DOCTYPE html> <!DOCTYPE html>
<html lang="en"> <html lang="en">
<head> <head>
@ -33,7 +34,7 @@
<li class="nav-item"> <li class="nav-item">
<a class="nav-link text-dark" asp-area="" asp-page="/Stats">Stats</a> <a class="nav-link text-dark" asp-area="" asp-page="/Stats">Stats</a>
</li> </li>
@if (!string.IsNullOrEmpty(Context.Session.GetString("authenticatedUser")) && new AppDb.DbConn().Users.First(p => p.Username == Context.Session.GetString("authenticatedUser")).IsAdmin) { @if (!string.IsNullOrEmpty(Context.Session.GetString("authenticatedUser")) && new Database.DbConn().Users.First(p => p.Username == Context.Session.GetString("authenticatedUser")).IsAdmin) {
<li class="nav-item"> <li class="nav-item">
<a class="nav-link text-dark" asp-area="" asp-page="/Admin">Admin</a> <a class="nav-link text-dark" asp-area="" asp-page="/Admin">Admin</a>
</li> </li>

View File

@ -1,4 +1,5 @@
@page @page
@using RTMPDash.Backend
@model StatsModel @model StatsModel
@{ @{
ViewData["Title"] = "Stats"; ViewData["Title"] = "Stats";

View File

@ -1,4 +1,2 @@
@using Microsoft.AspNetCore.Identity
@using RTMPDash
@namespace RTMPDash.Pages @namespace RTMPDash.Pages
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers @addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers

View File

@ -6,68 +6,72 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="linq2db" Version="3.2.3"/> <PackageReference Include="linq2db" Version="3.2.3" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation" Version="5.0.2"/> <PackageReference Include="Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation" Version="5.0.2" />
<PackageReference Include="Microsoft.Extensions.Caching.StackExchangeRedis" Version="5.0.1"/> <PackageReference Include="Microsoft.Extensions.Caching.StackExchangeRedis" Version="5.0.1" />
<PackageReference Include="System.Data.SQLite.Core" Version="1.0.113.7"/> <PackageReference Include="System.Data.SQLite.Core" Version="1.0.113.7" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<_ContentIncludedByDefault Remove="Areas\Identity\Pages\_ViewStart.cshtml"/> <_ContentIncludedByDefault Remove="Areas\Identity\Pages\_ViewStart.cshtml" />
<_ContentIncludedByDefault Remove="wwwroot\css\dark-mode.css"/> <_ContentIncludedByDefault Remove="wwwroot\css\dark-mode.css" />
<_ContentIncludedByDefault Remove="wwwroot\css\site.css"/> <_ContentIncludedByDefault Remove="wwwroot\css\site.css" />
<_ContentIncludedByDefault Remove="wwwroot\favicon.ico"/> <_ContentIncludedByDefault Remove="wwwroot\favicon.ico" />
<_ContentIncludedByDefault Remove="wwwroot\js\dark-mode-switch.js"/> <_ContentIncludedByDefault Remove="wwwroot\js\dark-mode-switch.js" />
<_ContentIncludedByDefault Remove="wwwroot\js\site.js"/> <_ContentIncludedByDefault Remove="wwwroot\js\site.js" />
<_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\css\bootstrap-grid.css"/> <_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\css\bootstrap-grid.css" />
<_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\css\bootstrap-grid.css.map"/> <_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\css\bootstrap-grid.css.map" />
<_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\css\bootstrap-grid.min.css"/> <_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\css\bootstrap-grid.min.css" />
<_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\css\bootstrap-grid.min.css.map"/> <_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\css\bootstrap-grid.min.css.map" />
<_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\css\bootstrap-reboot.css"/> <_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\css\bootstrap-reboot.css" />
<_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\css\bootstrap-reboot.css.map"/> <_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\css\bootstrap-reboot.css.map" />
<_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\css\bootstrap-reboot.min.css"/> <_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\css\bootstrap-reboot.min.css" />
<_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\css\bootstrap-reboot.min.css.map"/> <_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\css\bootstrap-reboot.min.css.map" />
<_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\css\bootstrap.css"/> <_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\css\bootstrap.css" />
<_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\css\bootstrap.css.map"/> <_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\css\bootstrap.css.map" />
<_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\css\bootstrap.min.css"/> <_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\css\bootstrap.min.css" />
<_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\css\bootstrap.min.css.map"/> <_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\css\bootstrap.min.css.map" />
<_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\js\bootstrap.bundle.js"/> <_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\js\bootstrap.bundle.js" />
<_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\js\bootstrap.bundle.js.map"/> <_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\js\bootstrap.bundle.js.map" />
<_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\js\bootstrap.bundle.min.js"/> <_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\js\bootstrap.bundle.min.js" />
<_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\js\bootstrap.bundle.min.js.map"/> <_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\js\bootstrap.bundle.min.js.map" />
<_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\js\bootstrap.js"/> <_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\js\bootstrap.js" />
<_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\js\bootstrap.js.map"/> <_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\js\bootstrap.js.map" />
<_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\js\bootstrap.min.js"/> <_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\js\bootstrap.min.js" />
<_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\js\bootstrap.min.js.map"/> <_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\js\bootstrap.min.js.map" />
<_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\LICENSE"/> <_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\LICENSE" />
<_ContentIncludedByDefault Remove="wwwroot\lib\jquery-validation-unobtrusive\jquery.validate.unobtrusive.js"/> <_ContentIncludedByDefault Remove="wwwroot\lib\jquery-validation-unobtrusive\jquery.validate.unobtrusive.js" />
<_ContentIncludedByDefault Remove="wwwroot\lib\jquery-validation-unobtrusive\jquery.validate.unobtrusive.min.js"/> <_ContentIncludedByDefault Remove="wwwroot\lib\jquery-validation-unobtrusive\jquery.validate.unobtrusive.min.js" />
<_ContentIncludedByDefault Remove="wwwroot\lib\jquery-validation-unobtrusive\LICENSE.txt"/> <_ContentIncludedByDefault Remove="wwwroot\lib\jquery-validation-unobtrusive\LICENSE.txt" />
<_ContentIncludedByDefault Remove="wwwroot\lib\jquery-validation\dist\additional-methods.js"/> <_ContentIncludedByDefault Remove="wwwroot\lib\jquery-validation\dist\additional-methods.js" />
<_ContentIncludedByDefault Remove="wwwroot\lib\jquery-validation\dist\additional-methods.min.js"/> <_ContentIncludedByDefault Remove="wwwroot\lib\jquery-validation\dist\additional-methods.min.js" />
<_ContentIncludedByDefault Remove="wwwroot\lib\jquery-validation\dist\jquery.validate.js"/> <_ContentIncludedByDefault Remove="wwwroot\lib\jquery-validation\dist\jquery.validate.js" />
<_ContentIncludedByDefault Remove="wwwroot\lib\jquery-validation\dist\jquery.validate.min.js"/> <_ContentIncludedByDefault Remove="wwwroot\lib\jquery-validation\dist\jquery.validate.min.js" />
<_ContentIncludedByDefault Remove="wwwroot\lib\jquery-validation\LICENSE.md"/> <_ContentIncludedByDefault Remove="wwwroot\lib\jquery-validation\LICENSE.md" />
<_ContentIncludedByDefault Remove="wwwroot\lib\jquery\dist\jquery.js"/> <_ContentIncludedByDefault Remove="wwwroot\lib\jquery\dist\jquery.js" />
<_ContentIncludedByDefault Remove="wwwroot\lib\jquery\dist\jquery.min.js"/> <_ContentIncludedByDefault Remove="wwwroot\lib\jquery\dist\jquery.min.js" />
<_ContentIncludedByDefault Remove="wwwroot\lib\jquery\dist\jquery.min.map"/> <_ContentIncludedByDefault Remove="wwwroot\lib\jquery\dist\jquery.min.map" />
<_ContentIncludedByDefault Remove="wwwroot\lib\jquery\LICENSE.txt"/> <_ContentIncludedByDefault Remove="wwwroot\lib\jquery\LICENSE.txt" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Compile Remove="wwwroot\**"/> <Compile Remove="wwwroot\**" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<EmbeddedResource Remove="wwwroot\**"/> <EmbeddedResource Remove="wwwroot\**" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<None Remove="wwwroot\**"/> <None Remove="wwwroot\**" />
<None Remove=".gitignore" />
<None Remove="app.db" />
<None Remove="app.db.bak" />
<None Remove="example.db" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Content Remove="wwwroot\**"/> <Content Remove="wwwroot\**" />
</ItemGroup> </ItemGroup>
</Project> </Project>