diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..24d589a --- /dev/null +++ b/.gitignore @@ -0,0 +1,257 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. + +# User-specific files +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ + +# Visual Studio 2015 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUNIT +*.VisualState.xml +TestResult.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# DNX +project.lock.json +project.fragment.lock.json +artifacts/ + +*_i.c +*_p.c +*_i.h +*.ilk +*.meta +*.obj +*.pch +*.pdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# JustCode is a .NET coding add-in +.JustCode + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# TODO: Comment the next line if you want to checkin your web deploy settings +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these files may be visible to others. +*.azurePubxml + +# NuGet Packages +*.nupkg +# The packages folder can be ignored because of Package Restore +**/packages/* +# except build/, which is used as an MSBuild target. +!**/packages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/packages/repositories.config +# NuGet v3's project.json files produces more ignoreable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.pfx +*.publishsettings +node_modules/ +orleans.codegen.cs + +# Since there are multiple workflows, uncomment the next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm + +# SQL Server files +*.mdf +*.ldf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# JetBrains Rider +.idea/ +*.sln.iml + +# CodeRush +.cr/ + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc \ No newline at end of file diff --git a/Client/Modules/TenTrees/Edit.razor b/Client/Modules/TenTrees/Edit.razor new file mode 100644 index 0000000..4fa9829 --- /dev/null +++ b/Client/Modules/TenTrees/Edit.razor @@ -0,0 +1,231 @@ +@using Oqtane.Modules.Controls +@using OE.TenTrees.Services +@using OE.TenTrees.Models + +@namespace OE.TenTrees.TenTrees +@inherits ModuleBase +@inject ITreeService TreeService +@inject NavigationManager NavigationManager +@inject IStringLocalizer Localizer + +
+
+
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+
+ + + @Localizer["Cancel"] +

+ @if (PageState.Action == "Edit") + { + + } +
+ +@code { + public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Edit; + + public override string Actions => "Add,Edit"; + + public override string Title => "Manage Tree"; + + public override List Resources => new List() + { + new Stylesheet(ModulePath() + "Module.css") + }; + + private ElementReference form; + private bool validated = false; + + private int _id; + private string _species = string.Empty; + private string _commonName = string.Empty; + private string _location = string.Empty; + private double _latitude = 0; + private double _longitude = 0; + private DateTime _plantedDate = DateTime.Today; + private string _status = "Healthy"; + private double? _height; + private double? _diameter; + private string _plantedBy = string.Empty; + private string _notes = string.Empty; + private string _createdby = string.Empty; + private DateTime _createdon; + private string _modifiedby = string.Empty; + private DateTime _modifiedon; + + protected override async Task OnInitializedAsync() + { + try + { + if (PageState.Action == "Edit") + { + _id = Int32.Parse(PageState.QueryString["id"]); + Tree tree = await TreeService.GetTreeAsync(_id, ModuleState.ModuleId); + if (tree != null) + { + _species = tree.Species; + _commonName = tree.CommonName ?? string.Empty; + _location = tree.Location ?? string.Empty; + _latitude = tree.Latitude; + _longitude = tree.Longitude; + _plantedDate = tree.PlantedDate; + _status = tree.Status; + _height = tree.Height; + _diameter = tree.Diameter; + _plantedBy = tree.PlantedBy ?? string.Empty; + _notes = tree.Notes ?? string.Empty; + _createdby = tree.CreatedBy; + _createdon = tree.CreatedOn; + _modifiedby = tree.ModifiedBy; + _modifiedon = tree.ModifiedOn; + } + } + } + catch (Exception ex) + { + await logger.LogError(ex, "Error Loading Tree {TreeId} {Error}", _id, ex.Message); + AddModuleMessage(Localizer["LoadError"], MessageType.Error); + } + } + + private async Task Save() + { + try + { + validated = true; + var interop = new Oqtane.UI.Interop(JSRuntime); + if (await interop.FormValid(form)) + { + if (PageState.Action == "Add") + { + Tree tree = new Tree(); + tree.ModuleId = ModuleState.ModuleId; + tree.Species = _species; + tree.CommonName = _commonName; + tree.Location = _location; + tree.Latitude = _latitude; + tree.Longitude = _longitude; + tree.PlantedDate = _plantedDate; + tree.Status = _status; + tree.Height = _height; + tree.Diameter = _diameter; + tree.PlantedBy = _plantedBy; + tree.Notes = _notes; + tree = await TreeService.AddTreeAsync(tree); + await logger.LogInformation("Tree Added {Tree}", tree); + } + else + { + Tree tree = await TreeService.GetTreeAsync(_id, ModuleState.ModuleId); + if (tree != null) + { + tree.Species = _species; + tree.CommonName = _commonName; + tree.Location = _location; + tree.Latitude = _latitude; + tree.Longitude = _longitude; + tree.PlantedDate = _plantedDate; + tree.Status = _status; + tree.Height = _height; + tree.Diameter = _diameter; + tree.PlantedBy = _plantedBy; + tree.Notes = _notes; + await TreeService.UpdateTreeAsync(tree); + await logger.LogInformation("Tree Updated {Tree}", tree); + } + } + NavigationManager.NavigateTo(NavigateUrl()); + } + else + { + AddModuleMessage(Localizer["SaveValidation"], MessageType.Warning); + } + } + catch (Exception ex) + { + await logger.LogError(ex, "Error Saving Tree {Error}", ex.Message); + AddModuleMessage(Localizer["SaveError"], MessageType.Error); + } + } +} \ No newline at end of file diff --git a/Client/Modules/TenTrees/Index.razor b/Client/Modules/TenTrees/Index.razor new file mode 100644 index 0000000..ca09da3 --- /dev/null +++ b/Client/Modules/TenTrees/Index.razor @@ -0,0 +1,154 @@ +@using OE.TenTrees.Services +@using OE.TenTrees.Models + +@namespace OE.TenTrees.TenTrees +@inherits ModuleBase +@inject ITreeService TreeService +@inject IPlantingEventService PlantingEventService +@inject NavigationManager NavigationManager +@inject IStringLocalizer Localizer + +@if (trees == null) +{ +

Loading...

+} +else +{ +
+
+
+

@Localizer["Title"]

+

@Localizer["Description"]

+
+
+ +
+
+
+
+

@totalTrees

+

@Localizer["TotalTrees"]

+ +
+
+
+
+
+
+

@totalPlantingEvents

+

@Localizer["PlantingEvents"]

+ +
+
+
+
+
+
+

@healthyTrees

+

@Localizer["HealthyTrees"]

+ +
+
+
+
+ + +
+
+ +
+
+

@Localizer["RecentTrees"]

+ @if (trees.Count > 0) + { + +
+   + @Localizer["Species"] + @Localizer["CommonName"] + @Localizer["Location"] + @Localizer["PlantedDate"] + @Localizer["Status"] +
+ + + @context.Species + @context.CommonName + @context.Location + @context.PlantedDate.ToString("MM/dd/yyyy") + + @context.Status + + +
+ } + else + { +

@Localizer["NoTrees"]

+ } +
+
+
+} + +@code { + public override List Resources => new List() + { + new Stylesheet(ModulePath() + "Module.css"), + new Script(ModulePath() + "Module.js") + }; + + private List? trees; + private int totalTrees = 0; + private int totalPlantingEvents = 0; + private int healthyTrees = 0; + + protected override async Task OnInitializedAsync() + { + try + { + await LoadData(); + } + catch (Exception ex) + { + await logger.LogError(ex, "Error Loading TenTrees Data {Error}", ex.Message); + AddModuleMessage(Localizer["LoadError"], MessageType.Error); + } + } + + private async Task LoadData() + { + trees = await TreeService.GetTreesAsync(ModuleState.ModuleId); + var plantingEvents = await PlantingEventService.GetPlantingEventsAsync(ModuleState.ModuleId); + + totalTrees = trees?.Count ?? 0; + totalPlantingEvents = plantingEvents?.Count ?? 0; + healthyTrees = trees?.Count(t => t.Status.Equals("Healthy", StringComparison.OrdinalIgnoreCase)) ?? 0; + } + + private void ViewTrees() + { + NavigationManager.NavigateTo(NavigateUrl("trees")); + } + + private void ViewPlantingEvents() + { + NavigationManager.NavigateTo(NavigateUrl("events")); + } + + private void ViewMonitoring() + { + NavigationManager.NavigateTo(NavigateUrl("monitoring")); + } + + private string GetStatusBadgeClass(string status) + { + return status?.ToLower() switch + { + "healthy" => "badge-success", + "needs attention" => "badge-warning", + "dead" => "badge-danger", + _ => "badge-secondary" + }; + } +} \ No newline at end of file diff --git a/Client/Modules/TenTrees/ModuleInfo.cs b/Client/Modules/TenTrees/ModuleInfo.cs new file mode 100644 index 0000000..87426b8 --- /dev/null +++ b/Client/Modules/TenTrees/ModuleInfo.cs @@ -0,0 +1,19 @@ +using Oqtane.Models; +using Oqtane.Modules; + +namespace OE.TenTrees.Modules.TenTrees +{ + public class ModuleInfo : IModule + { + public ModuleDefinition ModuleDefinition => new ModuleDefinition + { + Name = "TenTrees", + Description = "A module for managing tree planting, monitoring and conservation efforts", + Version = "1.0.0", + ServerManagerType = "OE.TenTrees.Manager.TenTreesManager, OE.TenTrees.Server.Oqtane", + ReleaseVersions = "1.0.0", + Dependencies = "OE.TenTrees.Shared.Oqtane", + PackageName = "OE.TenTrees" + }; + } +} \ No newline at end of file diff --git a/Client/Modules/TenTrees/Settings.razor b/Client/Modules/TenTrees/Settings.razor new file mode 100644 index 0000000..9649c43 --- /dev/null +++ b/Client/Modules/TenTrees/Settings.razor @@ -0,0 +1,91 @@ +@namespace OE.TenTrees.TenTrees +@inherits ModuleBase +@inject ISettingService SettingService +@inject IStringLocalizer Localizer + +
+
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+
+ +@code { + private string resourceType = "OE.TenTrees.Settings, OE.TenTrees.Client.Oqtane"; // for localization + public override string Title => "TenTrees Settings"; + + string _defaultLocation = string.Empty; + double _defaultLatitude = 0.0; + double _defaultLongitude = 0.0; + bool _enableNotifications = true; + string _organizationName = string.Empty; + + protected override async Task OnInitializedAsync() + { + try + { + Dictionary settings = await SettingService.GetModuleSettingsAsync(ModuleState.ModuleId); + _defaultLocation = SettingService.GetSetting(settings, "DefaultLocation", ""); + _defaultLatitude = SettingService.GetSetting(settings, "DefaultLatitude", 0.0); + _defaultLongitude = SettingService.GetSetting(settings, "DefaultLongitude", 0.0); + _enableNotifications = SettingService.GetSetting(settings, "EnableNotifications", true); + _organizationName = SettingService.GetSetting(settings, "OrganizationName", ""); + } + catch (Exception ex) + { + await logger.LogError(ex, "Error Loading TenTrees Settings {Error}", ex.Message); + AddModuleMessage(Localizer["LoadError"], MessageType.Error); + } + } + + public async Task UpdateSettings() + { + try + { + Dictionary settings = await SettingService.GetModuleSettingsAsync(ModuleState.ModuleId); + SettingService.SetSetting(settings, "DefaultLocation", _defaultLocation); + SettingService.SetSetting(settings, "DefaultLatitude", _defaultLatitude); + SettingService.SetSetting(settings, "DefaultLongitude", _defaultLongitude); + SettingService.SetSetting(settings, "EnableNotifications", _enableNotifications); + SettingService.SetSetting(settings, "OrganizationName", _organizationName); + await SettingService.UpdateModuleSettingsAsync(settings, ModuleState.ModuleId); + await logger.LogInformation("TenTrees Settings Updated Successfully"); + AddModuleMessage(Localizer["SettingsSaved"], MessageType.Success); + } + catch (Exception ex) + { + await logger.LogError(ex, "Error Saving TenTrees Settings {Error}", ex.Message); + AddModuleMessage(Localizer["SaveError"], MessageType.Error); + } + } +} \ No newline at end of file diff --git a/Client/OE.TenTrees.Client.csproj b/Client/OE.TenTrees.Client.csproj new file mode 100644 index 0000000..c1bea4c --- /dev/null +++ b/Client/OE.TenTrees.Client.csproj @@ -0,0 +1,23 @@ + + + + net8.0 + 1.0.0 + OE.TenTrees.Client.Oqtane + true + Default + false + true + enable + enable + + + + + + + + + + + \ No newline at end of file diff --git a/Client/Program.cs b/Client/Program.cs new file mode 100644 index 0000000..800ea69 --- /dev/null +++ b/Client/Program.cs @@ -0,0 +1,13 @@ +using System.Threading.Tasks; + +namespace OE.TenTrees.Client +{ + internal class Program + { + static async Task Main(string[] args) + { + // defer client startup to Oqtane - do not modify + await Oqtane.Client.Program.Main(args); + } + } +} \ No newline at end of file diff --git a/Client/Services/IPlantingEventService.cs b/Client/Services/IPlantingEventService.cs new file mode 100644 index 0000000..1977c2f --- /dev/null +++ b/Client/Services/IPlantingEventService.cs @@ -0,0 +1,15 @@ +using System.Collections.Generic; +using System.Threading.Tasks; +using OE.TenTrees.Models; + +namespace OE.TenTrees.Services +{ + public interface IPlantingEventService + { + Task> GetPlantingEventsAsync(int ModuleId); + Task GetPlantingEventAsync(int PlantingEventId, int ModuleId); + Task AddPlantingEventAsync(PlantingEvent plantingEvent); + Task UpdatePlantingEventAsync(PlantingEvent plantingEvent); + Task DeletePlantingEventAsync(int PlantingEventId, int ModuleId); + } +} \ No newline at end of file diff --git a/Client/Services/ITreeService.cs b/Client/Services/ITreeService.cs new file mode 100644 index 0000000..458dd5a --- /dev/null +++ b/Client/Services/ITreeService.cs @@ -0,0 +1,15 @@ +using System.Collections.Generic; +using System.Threading.Tasks; +using OE.TenTrees.Models; + +namespace OE.TenTrees.Services +{ + public interface ITreeService + { + Task> GetTreesAsync(int ModuleId); + Task GetTreeAsync(int TreeId, int ModuleId); + Task AddTreeAsync(Tree tree); + Task UpdateTreeAsync(Tree tree); + Task DeleteTreeAsync(int TreeId, int ModuleId); + } +} \ No newline at end of file diff --git a/Client/Services/PlantingEventService.cs b/Client/Services/PlantingEventService.cs new file mode 100644 index 0000000..8cccc32 --- /dev/null +++ b/Client/Services/PlantingEventService.cs @@ -0,0 +1,40 @@ +using System.Collections.Generic; +using System.Net.Http; +using System.Threading.Tasks; +using Oqtane.Services; +using OE.TenTrees.Models; + +namespace OE.TenTrees.Services +{ + public class PlantingEventService : ServiceBase, IPlantingEventService + { + public PlantingEventService(HttpClient http, SiteState siteState) : base(http, siteState) { } + + private string Apiurl => CreateApiUrl("PlantingEvent"); + + public async Task> GetPlantingEventsAsync(int ModuleId) + { + return await GetJsonAsync>($"{Apiurl}?moduleid={ModuleId}"); + } + + public async Task GetPlantingEventAsync(int PlantingEventId, int ModuleId) + { + return await GetJsonAsync($"{Apiurl}/{PlantingEventId}?moduleid={ModuleId}"); + } + + public async Task AddPlantingEventAsync(PlantingEvent plantingEvent) + { + return await PostJsonAsync(Apiurl, plantingEvent); + } + + public async Task UpdatePlantingEventAsync(PlantingEvent plantingEvent) + { + return await PutJsonAsync($"{Apiurl}/{plantingEvent.PlantingEventId}", plantingEvent); + } + + public async Task DeletePlantingEventAsync(int PlantingEventId, int ModuleId) + { + await DeleteAsync($"{Apiurl}/{PlantingEventId}?moduleid={ModuleId}"); + } + } +} \ No newline at end of file diff --git a/Client/Services/TreeService.cs b/Client/Services/TreeService.cs new file mode 100644 index 0000000..948477c --- /dev/null +++ b/Client/Services/TreeService.cs @@ -0,0 +1,40 @@ +using System.Collections.Generic; +using System.Net.Http; +using System.Threading.Tasks; +using Oqtane.Services; +using OE.TenTrees.Models; + +namespace OE.TenTrees.Services +{ + public class TreeService : ServiceBase, ITreeService + { + public TreeService(HttpClient http, SiteState siteState) : base(http, siteState) { } + + private string Apiurl => CreateApiUrl("Tree"); + + public async Task> GetTreesAsync(int ModuleId) + { + return await GetJsonAsync>($"{Apiurl}?moduleid={ModuleId}"); + } + + public async Task GetTreeAsync(int TreeId, int ModuleId) + { + return await GetJsonAsync($"{Apiurl}/{TreeId}?moduleid={ModuleId}"); + } + + public async Task AddTreeAsync(Tree tree) + { + return await PostJsonAsync(Apiurl, tree); + } + + public async Task UpdateTreeAsync(Tree tree) + { + return await PutJsonAsync($"{Apiurl}/{tree.TreeId}", tree); + } + + public async Task DeleteTreeAsync(int TreeId, int ModuleId) + { + await DeleteAsync($"{Apiurl}/{TreeId}?moduleid={ModuleId}"); + } + } +} \ No newline at end of file diff --git a/Client/Startup/ClientStartup.cs b/Client/Startup/ClientStartup.cs new file mode 100644 index 0000000..0e18777 --- /dev/null +++ b/Client/Startup/ClientStartup.cs @@ -0,0 +1,15 @@ +using Microsoft.Extensions.DependencyInjection; +using Oqtane.Services; +using OE.TenTrees.Services; + +namespace OE.TenTrees.Startup +{ + public class ClientStartup : IClientStartup + { + public void ConfigureServices(IServiceCollection services) + { + services.AddScoped(); + services.AddScoped(); + } + } +} \ No newline at end of file diff --git a/Client/_Imports.razor b/Client/_Imports.razor new file mode 100644 index 0000000..9174aff --- /dev/null +++ b/Client/_Imports.razor @@ -0,0 +1,27 @@ +@using System +@using System.Linq +@using System.Collections.Generic +@using System.Net.Http +@using System.Net.Http.Json + +@using Microsoft.AspNetCore.Components.Authorization +@using Microsoft.AspNetCore.Components.Routing +@using Microsoft.AspNetCore.Components.Web +@using Microsoft.Extensions.Localization +@using Microsoft.JSInterop + +@using Oqtane +@using Oqtane.Models +@using Oqtane.Modules +@using Oqtane.Modules.Controls +@using Oqtane.Providers +@using Oqtane.Security +@using Oqtane.Services +@using Oqtane.Shared +@using Oqtane.Themes +@using Oqtane.Themes.Controls +@using Oqtane.UI +@using Oqtane.Enums +@using Oqtane.Interfaces + +@using OE.TenTrees.Services \ No newline at end of file diff --git a/Client/obj/Debug/net8.0/.NETCoreApp,Version=v8.0.AssemblyAttributes.cs b/Client/obj/Debug/net8.0/.NETCoreApp,Version=v8.0.AssemblyAttributes.cs new file mode 100644 index 0000000..2217181 --- /dev/null +++ b/Client/obj/Debug/net8.0/.NETCoreApp,Version=v8.0.AssemblyAttributes.cs @@ -0,0 +1,4 @@ +// +using System; +using System.Reflection; +[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v8.0", FrameworkDisplayName = ".NET 8.0")] diff --git a/Client/obj/Debug/net8.0/OE.TenTrees.Client.AssemblyInfo.cs b/Client/obj/Debug/net8.0/OE.TenTrees.Client.AssemblyInfo.cs new file mode 100644 index 0000000..bdb28bf --- /dev/null +++ b/Client/obj/Debug/net8.0/OE.TenTrees.Client.AssemblyInfo.cs @@ -0,0 +1,22 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Reflection.AssemblyCompanyAttribute("OE.TenTrees.Client.Oqtane")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+d4cd3fc9c5c09a1849179819dbe99d6700234433")] +[assembly: System.Reflection.AssemblyProductAttribute("OE.TenTrees.Client.Oqtane")] +[assembly: System.Reflection.AssemblyTitleAttribute("OE.TenTrees.Client.Oqtane")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] + +// Generated by the MSBuild WriteCodeFragment class. + diff --git a/Client/obj/Debug/net8.0/OE.TenTrees.Client.AssemblyInfoInputs.cache b/Client/obj/Debug/net8.0/OE.TenTrees.Client.AssemblyInfoInputs.cache new file mode 100644 index 0000000..30e5743 --- /dev/null +++ b/Client/obj/Debug/net8.0/OE.TenTrees.Client.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +bdc19c59de3ff3e9b12830ff1cc16a7360e2486405ff79d2d6d5d9610d460960 diff --git a/Client/obj/Debug/net8.0/OE.TenTrees.Client.GeneratedMSBuildEditorConfig.editorconfig b/Client/obj/Debug/net8.0/OE.TenTrees.Client.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..ecf5443 --- /dev/null +++ b/Client/obj/Debug/net8.0/OE.TenTrees.Client.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,39 @@ +is_global = true +build_property.EnableAotAnalyzer = +build_property.EnableSingleFileAnalyzer = +build_property.EnableTrimAnalyzer = false +build_property.IncludeAllContentForSelfExtract = +build_property.TargetFramework = net8.0 +build_property.TargetPlatformMinVersion = +build_property.UsingMicrosoftNETSdkWeb = +build_property.ProjectTypeGuids = +build_property.InvariantGlobalization = false +build_property.PlatformNeutralAssembly = +build_property.EnforceExtendedAnalyzerRules = +build_property._SupportedPlatformList = browser +build_property.RootNamespace = OE.TenTrees.Client +build_property.RootNamespace = OE.TenTrees.Client +build_property.ProjectDir = /home/runner/work/TenTrees/TenTrees/Client/ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = false +build_property.RazorLangVersion = 8.0 +build_property.SupportLocalizedComponentNames = +build_property.GenerateRazorMetadataSourceChecksumAttributes = +build_property.MSBuildProjectDirectory = /home/runner/work/TenTrees/TenTrees/Client +build_property._RazorSourceGeneratorDebug = + +[/home/runner/work/TenTrees/TenTrees/Client/Modules/TenTrees/Edit.razor] +build_metadata.AdditionalFiles.TargetPath = TW9kdWxlcy9UZW5UcmVlcy9FZGl0LnJhem9y +build_metadata.AdditionalFiles.CssScope = + +[/home/runner/work/TenTrees/TenTrees/Client/Modules/TenTrees/Index.razor] +build_metadata.AdditionalFiles.TargetPath = TW9kdWxlcy9UZW5UcmVlcy9JbmRleC5yYXpvcg== +build_metadata.AdditionalFiles.CssScope = + +[/home/runner/work/TenTrees/TenTrees/Client/Modules/TenTrees/Settings.razor] +build_metadata.AdditionalFiles.TargetPath = TW9kdWxlcy9UZW5UcmVlcy9TZXR0aW5ncy5yYXpvcg== +build_metadata.AdditionalFiles.CssScope = + +[/home/runner/work/TenTrees/TenTrees/Client/_Imports.razor] +build_metadata.AdditionalFiles.TargetPath = X0ltcG9ydHMucmF6b3I= +build_metadata.AdditionalFiles.CssScope = diff --git a/Client/obj/Debug/net8.0/OE.TenTrees.Client.GlobalUsings.g.cs b/Client/obj/Debug/net8.0/OE.TenTrees.Client.GlobalUsings.g.cs new file mode 100644 index 0000000..0103b59 --- /dev/null +++ b/Client/obj/Debug/net8.0/OE.TenTrees.Client.GlobalUsings.g.cs @@ -0,0 +1,11 @@ +// +global using global::Microsoft.Extensions.Configuration; +global using global::Microsoft.Extensions.DependencyInjection; +global using global::Microsoft.Extensions.Logging; +global using global::System; +global using global::System.Collections.Generic; +global using global::System.IO; +global using global::System.Linq; +global using global::System.Net.Http; +global using global::System.Threading; +global using global::System.Threading.Tasks; diff --git a/Client/obj/Debug/net8.0/OE.TenTrees.Client.Oqtane.MvcApplicationPartsAssemblyInfo.cache b/Client/obj/Debug/net8.0/OE.TenTrees.Client.Oqtane.MvcApplicationPartsAssemblyInfo.cache new file mode 100644 index 0000000..e69de29 diff --git a/Client/obj/Debug/net8.0/OE.TenTrees.Client.assets.cache b/Client/obj/Debug/net8.0/OE.TenTrees.Client.assets.cache new file mode 100644 index 0000000..9d96940 Binary files /dev/null and b/Client/obj/Debug/net8.0/OE.TenTrees.Client.assets.cache differ diff --git a/Client/obj/Debug/net8.0/OE.TenTrees.Client.csproj.AssemblyReference.cache b/Client/obj/Debug/net8.0/OE.TenTrees.Client.csproj.AssemblyReference.cache new file mode 100644 index 0000000..8d11b72 Binary files /dev/null and b/Client/obj/Debug/net8.0/OE.TenTrees.Client.csproj.AssemblyReference.cache differ diff --git a/Client/obj/Debug/net8.0/OE.TenTrees.Client.csproj.CoreCompileInputs.cache b/Client/obj/Debug/net8.0/OE.TenTrees.Client.csproj.CoreCompileInputs.cache new file mode 100644 index 0000000..ba5aa92 --- /dev/null +++ b/Client/obj/Debug/net8.0/OE.TenTrees.Client.csproj.CoreCompileInputs.cache @@ -0,0 +1 @@ +6a8cad1e241799d5dfe62dabbf55b74eb6d558ff4cf41d5e623e8c4e9fbdf4d0 diff --git a/Client/obj/Debug/net8.0/OE.TenTrees.Client.csproj.FileListAbsolute.txt b/Client/obj/Debug/net8.0/OE.TenTrees.Client.csproj.FileListAbsolute.txt new file mode 100644 index 0000000..2d4e8af --- /dev/null +++ b/Client/obj/Debug/net8.0/OE.TenTrees.Client.csproj.FileListAbsolute.txt @@ -0,0 +1,7 @@ +/home/runner/work/TenTrees/TenTrees/Client/obj/Debug/net8.0/OE.TenTrees.Client.csproj.AssemblyReference.cache +/home/runner/work/TenTrees/TenTrees/Client/obj/Debug/net8.0/OE.TenTrees.Client.GeneratedMSBuildEditorConfig.editorconfig +/home/runner/work/TenTrees/TenTrees/Client/obj/Debug/net8.0/OE.TenTrees.Client.AssemblyInfoInputs.cache +/home/runner/work/TenTrees/TenTrees/Client/obj/Debug/net8.0/OE.TenTrees.Client.AssemblyInfo.cs +/home/runner/work/TenTrees/TenTrees/Client/obj/Debug/net8.0/OE.TenTrees.Client.csproj.CoreCompileInputs.cache +/home/runner/work/TenTrees/TenTrees/Client/obj/Debug/net8.0/OE.TenTrees.Client.Oqtane.MvcApplicationPartsAssemblyInfo.cache +/home/runner/work/TenTrees/TenTrees/Client/obj/Debug/net8.0/OE.TenTrees.Client.sourcelink.json diff --git a/Client/obj/Debug/net8.0/OE.TenTrees.Client.sourcelink.json b/Client/obj/Debug/net8.0/OE.TenTrees.Client.sourcelink.json new file mode 100644 index 0000000..952e2ce --- /dev/null +++ b/Client/obj/Debug/net8.0/OE.TenTrees.Client.sourcelink.json @@ -0,0 +1 @@ +{"documents":{"/home/runner/work/TenTrees/TenTrees/*":"https://raw.githubusercontent.com/OpenEugene/TenTrees/d4cd3fc9c5c09a1849179819dbe99d6700234433/*"}} \ No newline at end of file diff --git a/Client/obj/OE.TenTrees.Client.csproj.nuget.dgspec.json b/Client/obj/OE.TenTrees.Client.csproj.nuget.dgspec.json new file mode 100644 index 0000000..508d088 --- /dev/null +++ b/Client/obj/OE.TenTrees.Client.csproj.nuget.dgspec.json @@ -0,0 +1,153 @@ +{ + "format": 1, + "restore": { + "/home/runner/work/TenTrees/TenTrees/Client/OE.TenTrees.Client.csproj": {} + }, + "projects": { + "/home/runner/work/TenTrees/TenTrees/Client/OE.TenTrees.Client.csproj": { + "version": "1.0.0", + "restore": { + "projectUniqueName": "/home/runner/work/TenTrees/TenTrees/Client/OE.TenTrees.Client.csproj", + "projectName": "OE.TenTrees.Client.Oqtane", + "projectPath": "/home/runner/work/TenTrees/TenTrees/Client/OE.TenTrees.Client.csproj", + "packagesPath": "/home/runner/.nuget/packages/", + "outputPath": "/home/runner/work/TenTrees/TenTrees/Client/obj/", + "projectStyle": "PackageReference", + "configFilePaths": [ + "/home/runner/.nuget/NuGet/NuGet.Config" + ], + "originalTargetFrameworks": [ + "net8.0" + ], + "sources": { + "https://api.nuget.org/v3/index.json": {} + }, + "frameworks": { + "net8.0": { + "targetAlias": "net8.0", + "projectReferences": { + "/home/runner/work/TenTrees/TenTrees/Shared/OE.TenTrees.Shared.csproj": { + "projectPath": "/home/runner/work/TenTrees/TenTrees/Shared/OE.TenTrees.Shared.csproj" + } + } + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + } + }, + "frameworks": { + "net8.0": { + "targetAlias": "net8.0", + "dependencies": { + "Microsoft.NET.ILLink.Tasks": { + "suppressParent": "All", + "target": "Package", + "version": "[8.0.19, )", + "autoReferenced": true + }, + "Microsoft.NET.Sdk.WebAssembly.Pack": { + "suppressParent": "All", + "target": "Package", + "version": "[8.0.19, )", + "autoReferenced": true + }, + "Oqtane.Client": { + "target": "Package", + "version": "[5.2.4, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48", + "net481" + ], + "assetTargetFallback": true, + "warn": true, + "downloadDependencies": [ + { + "name": "Microsoft.NETCore.App.Runtime.Mono.browser-wasm", + "version": "[8.0.19, 8.0.19]" + } + ], + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + } + }, + "runtimeIdentifierGraphPath": "/usr/lib/dotnet/sdk/8.0.119/PortableRuntimeIdentifierGraph.json" + } + }, + "runtimes": { + "browser-wasm": { + "#import": [] + } + } + }, + "/home/runner/work/TenTrees/TenTrees/Shared/OE.TenTrees.Shared.csproj": { + "version": "1.0.0", + "restore": { + "projectUniqueName": "/home/runner/work/TenTrees/TenTrees/Shared/OE.TenTrees.Shared.csproj", + "projectName": "OE.TenTrees.Shared.Oqtane", + "projectPath": "/home/runner/work/TenTrees/TenTrees/Shared/OE.TenTrees.Shared.csproj", + "packagesPath": "/home/runner/.nuget/packages/", + "outputPath": "/home/runner/work/TenTrees/TenTrees/Shared/obj/", + "projectStyle": "PackageReference", + "configFilePaths": [ + "/home/runner/.nuget/NuGet/NuGet.Config" + ], + "originalTargetFrameworks": [ + "net8.0" + ], + "sources": { + "https://api.nuget.org/v3/index.json": {} + }, + "frameworks": { + "net8.0": { + "targetAlias": "net8.0", + "projectReferences": {} + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + } + }, + "frameworks": { + "net8.0": { + "targetAlias": "net8.0", + "dependencies": { + "Oqtane.Shared": { + "target": "Package", + "version": "[5.2.4, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48", + "net481" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + } + }, + "runtimeIdentifierGraphPath": "/usr/lib/dotnet/sdk/8.0.119/PortableRuntimeIdentifierGraph.json" + } + } + } + } +} \ No newline at end of file diff --git a/Client/obj/OE.TenTrees.Client.csproj.nuget.g.props b/Client/obj/OE.TenTrees.Client.csproj.nuget.g.props new file mode 100644 index 0000000..4adb88d --- /dev/null +++ b/Client/obj/OE.TenTrees.Client.csproj.nuget.g.props @@ -0,0 +1,23 @@ + + + + True + NuGet + $(MSBuildThisFileDirectory)project.assets.json + /home/runner/.nuget/packages/ + /home/runner/.nuget/packages/ + PackageReference + 6.8.1 + + + + + + + + + + /home/runner/.nuget/packages/microsoft.net.sdk.webassembly.pack/8.0.19 + /home/runner/.nuget/packages/microsoft.net.illink.tasks/8.0.19 + + \ No newline at end of file diff --git a/Client/obj/OE.TenTrees.Client.csproj.nuget.g.targets b/Client/obj/OE.TenTrees.Client.csproj.nuget.g.targets new file mode 100644 index 0000000..8718c5a --- /dev/null +++ b/Client/obj/OE.TenTrees.Client.csproj.nuget.g.targets @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/Client/obj/project.assets.json b/Client/obj/project.assets.json new file mode 100644 index 0000000..9267e97 --- /dev/null +++ b/Client/obj/project.assets.json @@ -0,0 +1,350 @@ +{ + "version": 3, + "targets": { + "net8.0": { + "Microsoft.NET.ILLink.Tasks/8.0.19": { + "type": "package", + "build": { + "build/Microsoft.NET.ILLink.Tasks.props": {} + } + }, + "Microsoft.NET.Sdk.WebAssembly.Pack/8.0.19": { + "type": "package", + "build": { + "build/Microsoft.NET.Sdk.WebAssembly.Pack.props": {}, + "build/Microsoft.NET.Sdk.WebAssembly.Pack.targets": {} + } + }, + "Oqtane.Client/5.2.4": { + "type": "package", + "compile": { + "lib/net8.0/Oqtane.Client.dll": { + "related": ".pdb" + } + }, + "runtime": { + "lib/net8.0/Oqtane.Client.dll": { + "related": ".pdb" + } + } + }, + "Oqtane.Shared/5.2.4": { + "type": "package", + "compile": { + "lib/net8.0/Oqtane.Shared.dll": { + "related": ".pdb" + } + }, + "runtime": { + "lib/net8.0/Oqtane.Shared.dll": { + "related": ".pdb" + } + } + }, + "OE.TenTrees.Shared.Oqtane/1.0.0": { + "type": "project", + "framework": ".NETCoreApp,Version=v8.0", + "dependencies": { + "Oqtane.Shared": "5.2.4" + }, + "compile": { + "bin/placeholder/OE.TenTrees.Shared.Oqtane.dll": {} + }, + "runtime": { + "bin/placeholder/OE.TenTrees.Shared.Oqtane.dll": {} + } + } + }, + "net8.0/browser-wasm": { + "Microsoft.NET.ILLink.Tasks/8.0.19": { + "type": "package", + "build": { + "build/Microsoft.NET.ILLink.Tasks.props": {} + } + }, + "Microsoft.NET.Sdk.WebAssembly.Pack/8.0.19": { + "type": "package", + "build": { + "build/Microsoft.NET.Sdk.WebAssembly.Pack.props": {}, + "build/Microsoft.NET.Sdk.WebAssembly.Pack.targets": {} + } + }, + "Oqtane.Client/5.2.4": { + "type": "package", + "compile": { + "lib/net8.0/Oqtane.Client.dll": { + "related": ".pdb" + } + }, + "runtime": { + "lib/net8.0/Oqtane.Client.dll": { + "related": ".pdb" + } + } + }, + "Oqtane.Shared/5.2.4": { + "type": "package", + "compile": { + "lib/net8.0/Oqtane.Shared.dll": { + "related": ".pdb" + } + }, + "runtime": { + "lib/net8.0/Oqtane.Shared.dll": { + "related": ".pdb" + } + } + }, + "OE.TenTrees.Shared.Oqtane/1.0.0": { + "type": "project", + "framework": ".NETCoreApp,Version=v8.0", + "dependencies": { + "Oqtane.Shared": "5.2.4" + }, + "compile": { + "bin/placeholder/OE.TenTrees.Shared.Oqtane.dll": {} + }, + "runtime": { + "bin/placeholder/OE.TenTrees.Shared.Oqtane.dll": {} + } + } + } + }, + "libraries": { + "Microsoft.NET.ILLink.Tasks/8.0.19": { + "sha512": "IhHf+zeZiaE5EXRyxILd4qM+Hj9cxV3sa8MpzZgeEhpvaG3a1VEGF6UCaPFLO44Kua3JkLKluE0SWVamS50PlA==", + "type": "package", + "path": "microsoft.net.illink.tasks/8.0.19", + "hasTools": true, + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "LICENSE.TXT", + "Sdk/Sdk.props", + "THIRD-PARTY-NOTICES.TXT", + "analyzers/dotnet/cs/ILLink.CodeFixProvider.dll", + "analyzers/dotnet/cs/ILLink.RoslynAnalyzer.dll", + "build/Microsoft.NET.ILLink.Analyzers.props", + "build/Microsoft.NET.ILLink.Tasks.props", + "build/Microsoft.NET.ILLink.targets", + "microsoft.net.illink.tasks.8.0.19.nupkg.sha512", + "microsoft.net.illink.tasks.nuspec", + "tools/net472/ILLink.Tasks.dll", + "tools/net472/ILLink.Tasks.dll.config", + "tools/net472/Mono.Cecil.Mdb.dll", + "tools/net472/Mono.Cecil.Pdb.dll", + "tools/net472/Mono.Cecil.Rocks.dll", + "tools/net472/Mono.Cecil.dll", + "tools/net472/Sdk/Sdk.props", + "tools/net472/System.Buffers.dll", + "tools/net472/System.Collections.Immutable.dll", + "tools/net472/System.Memory.dll", + "tools/net472/System.Numerics.Vectors.dll", + "tools/net472/System.Reflection.Metadata.dll", + "tools/net472/System.Runtime.CompilerServices.Unsafe.dll", + "tools/net472/build/Microsoft.NET.ILLink.Analyzers.props", + "tools/net472/build/Microsoft.NET.ILLink.Tasks.props", + "tools/net472/build/Microsoft.NET.ILLink.targets", + "tools/net8.0/ILLink.Tasks.deps.json", + "tools/net8.0/ILLink.Tasks.dll", + "tools/net8.0/Mono.Cecil.Mdb.dll", + "tools/net8.0/Mono.Cecil.Pdb.dll", + "tools/net8.0/Mono.Cecil.Rocks.dll", + "tools/net8.0/Mono.Cecil.dll", + "tools/net8.0/Sdk/Sdk.props", + "tools/net8.0/build/Microsoft.NET.ILLink.Analyzers.props", + "tools/net8.0/build/Microsoft.NET.ILLink.Tasks.props", + "tools/net8.0/build/Microsoft.NET.ILLink.targets", + "tools/net8.0/illink.deps.json", + "tools/net8.0/illink.dll", + "tools/net8.0/illink.runtimeconfig.json", + "useSharedDesignerContext.txt" + ] + }, + "Microsoft.NET.Sdk.WebAssembly.Pack/8.0.19": { + "sha512": "Cm/sq4ET7XGU7jBSfSh+s+eV0faJ1RnErpImRYN7+d5loWISBwl22qsM6sn9StUWKJao+xGvF0IxgyPVnY20Vw==", + "type": "package", + "path": "microsoft.net.sdk.webassembly.pack/8.0.19", + "hasTools": true, + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "Icon.png", + "LICENSE.TXT", + "THIRD-PARTY-NOTICES.TXT", + "WasmAppHost/BrowserDebugHost.deps.json", + "WasmAppHost/BrowserDebugHost.dll", + "WasmAppHost/BrowserDebugHost.runtimeconfig.json", + "WasmAppHost/BrowserDebugProxy.dll", + "WasmAppHost/Microsoft.CodeAnalysis.CSharp.Scripting.dll", + "WasmAppHost/Microsoft.CodeAnalysis.CSharp.dll", + "WasmAppHost/Microsoft.CodeAnalysis.Scripting.dll", + "WasmAppHost/Microsoft.CodeAnalysis.dll", + "WasmAppHost/Microsoft.FileFormats.dll", + "WasmAppHost/Microsoft.NET.WebAssembly.Webcil.dll", + "WasmAppHost/Microsoft.SymbolStore.dll", + "WasmAppHost/Newtonsoft.Json.dll", + "WasmAppHost/WasmAppHost.deps.json", + "WasmAppHost/WasmAppHost.dll", + "WasmAppHost/WasmAppHost.runtimeconfig.json", + "build/Microsoft.NET.Sdk.WebAssembly.Browser.props", + "build/Microsoft.NET.Sdk.WebAssembly.Browser.targets", + "build/Microsoft.NET.Sdk.WebAssembly.Pack.props", + "build/Microsoft.NET.Sdk.WebAssembly.Pack.targets", + "build/Wasm.web.config", + "microsoft.net.sdk.webassembly.pack.8.0.19.nupkg.sha512", + "microsoft.net.sdk.webassembly.pack.nuspec", + "tools/net472/Microsoft.NET.Sdk.WebAssembly.Pack.Tasks.dll", + "tools/net472/Microsoft.NET.WebAssembly.Webcil.dll", + "tools/net8.0/Microsoft.NET.Sdk.WebAssembly.Pack.Tasks.dll", + "tools/net8.0/Microsoft.NET.WebAssembly.Webcil.dll" + ] + }, + "Oqtane.Client/5.2.4": { + "sha512": "5McfrfhrXJZ7ReG8XSz0YEBTNqb7awX8CpIixqrXFkfHZdEcaHVcborx7LY1epUXP7BUUYcR4zsVLR0s7mu+Dw==", + "type": "package", + "path": "oqtane.client/5.2.4", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "icon.png", + "lib/net8.0/Oqtane.Client.dll", + "lib/net8.0/Oqtane.Client.pdb", + "oqtane.client.5.2.4.nupkg.sha512", + "oqtane.client.nuspec", + "readme.md" + ] + }, + "Oqtane.Shared/5.2.4": { + "sha512": "lczEoyrGnVvTTeIoH/8EMb4CSbIqPhkT4SLQ/0uwCwgtgdBYp46fyJ4vColzcO4Yb2VY4YsWnmNkVYDV7oOXGg==", + "type": "package", + "path": "oqtane.shared/5.2.4", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "icon.png", + "lib/net8.0/Oqtane.Shared.dll", + "lib/net8.0/Oqtane.Shared.pdb", + "oqtane.shared.5.2.4.nupkg.sha512", + "oqtane.shared.nuspec", + "readme.md" + ] + }, + "OE.TenTrees.Shared.Oqtane/1.0.0": { + "type": "project", + "path": "../Shared/OE.TenTrees.Shared.csproj", + "msbuildProject": "../Shared/OE.TenTrees.Shared.csproj" + } + }, + "projectFileDependencyGroups": { + "net8.0": [ + "Microsoft.NET.ILLink.Tasks >= 8.0.19", + "Microsoft.NET.Sdk.WebAssembly.Pack >= 8.0.19", + "OE.TenTrees.Shared.Oqtane >= 1.0.0", + "Oqtane.Client >= 5.2.4" + ] + }, + "packageFolders": { + "/home/runner/.nuget/packages/": {} + }, + "project": { + "version": "1.0.0", + "restore": { + "projectUniqueName": "/home/runner/work/TenTrees/TenTrees/Client/OE.TenTrees.Client.csproj", + "projectName": "OE.TenTrees.Client.Oqtane", + "projectPath": "/home/runner/work/TenTrees/TenTrees/Client/OE.TenTrees.Client.csproj", + "packagesPath": "/home/runner/.nuget/packages/", + "outputPath": "/home/runner/work/TenTrees/TenTrees/Client/obj/", + "projectStyle": "PackageReference", + "configFilePaths": [ + "/home/runner/.nuget/NuGet/NuGet.Config" + ], + "originalTargetFrameworks": [ + "net8.0" + ], + "sources": { + "https://api.nuget.org/v3/index.json": {} + }, + "frameworks": { + "net8.0": { + "targetAlias": "net8.0", + "projectReferences": { + "/home/runner/work/TenTrees/TenTrees/Shared/OE.TenTrees.Shared.csproj": { + "projectPath": "/home/runner/work/TenTrees/TenTrees/Shared/OE.TenTrees.Shared.csproj" + } + } + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + } + }, + "frameworks": { + "net8.0": { + "targetAlias": "net8.0", + "dependencies": { + "Microsoft.NET.ILLink.Tasks": { + "suppressParent": "All", + "target": "Package", + "version": "[8.0.19, )", + "autoReferenced": true + }, + "Microsoft.NET.Sdk.WebAssembly.Pack": { + "suppressParent": "All", + "target": "Package", + "version": "[8.0.19, )", + "autoReferenced": true + }, + "Oqtane.Client": { + "target": "Package", + "version": "[5.2.4, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48", + "net481" + ], + "assetTargetFallback": true, + "warn": true, + "downloadDependencies": [ + { + "name": "Microsoft.NETCore.App.Runtime.Mono.browser-wasm", + "version": "[8.0.19, 8.0.19]" + } + ], + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + } + }, + "runtimeIdentifierGraphPath": "/usr/lib/dotnet/sdk/8.0.119/PortableRuntimeIdentifierGraph.json" + } + }, + "runtimes": { + "browser-wasm": { + "#import": [] + } + } + }, + "logs": [ + { + "code": "NU1901", + "level": "Warning", + "warningLevel": 1, + "message": "Package 'Oqtane.Client' 5.2.4 has a known low severity vulnerability, https://github.com/advisories/GHSA-2hr5-cvwp-jr5w", + "libraryId": "Oqtane.Client", + "targetGraphs": [ + "net8.0", + "net8.0/browser-wasm" + ] + } + ] +} \ No newline at end of file diff --git a/Client/obj/project.nuget.cache b/Client/obj/project.nuget.cache new file mode 100644 index 0000000..d8255f5 --- /dev/null +++ b/Client/obj/project.nuget.cache @@ -0,0 +1,26 @@ +{ + "version": 2, + "dgSpecHash": "bSz4+PBf6tjyzYbSySU4hP4HPt4Yt12sw1uiEdRfuWtQTtMM0kozu4vZBToY8aJcId7JqcegBD3/nJujS99oXQ==", + "success": true, + "projectFilePath": "/home/runner/work/TenTrees/TenTrees/Client/OE.TenTrees.Client.csproj", + "expectedPackageFiles": [ + "/home/runner/.nuget/packages/microsoft.net.illink.tasks/8.0.19/microsoft.net.illink.tasks.8.0.19.nupkg.sha512", + "/home/runner/.nuget/packages/microsoft.net.sdk.webassembly.pack/8.0.19/microsoft.net.sdk.webassembly.pack.8.0.19.nupkg.sha512", + "/home/runner/.nuget/packages/oqtane.client/5.2.4/oqtane.client.5.2.4.nupkg.sha512", + "/home/runner/.nuget/packages/oqtane.shared/5.2.4/oqtane.shared.5.2.4.nupkg.sha512", + "/home/runner/.nuget/packages/microsoft.netcore.app.runtime.mono.browser-wasm/8.0.19/microsoft.netcore.app.runtime.mono.browser-wasm.8.0.19.nupkg.sha512" + ], + "logs": [ + { + "code": "NU1901", + "level": "Warning", + "warningLevel": 1, + "message": "Package 'Oqtane.Client' 5.2.4 has a known low severity vulnerability, https://github.com/advisories/GHSA-2hr5-cvwp-jr5w", + "libraryId": "Oqtane.Client", + "targetGraphs": [ + "net8.0", + "net8.0/browser-wasm" + ] + } + ] +} \ No newline at end of file diff --git a/OE.TenTrees.sln b/OE.TenTrees.sln new file mode 100644 index 0000000..6de3f2f --- /dev/null +++ b/OE.TenTrees.sln @@ -0,0 +1,33 @@ +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.12.35506.116 d17.12 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "OE.TenTrees.Server", "Server\OE.TenTrees.Server.csproj", "{04B05448-788F-433D-92C0-FED35122D45A}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "OE.TenTrees.Client", "Client\OE.TenTrees.Client.csproj", "{AA8E58A1-CD09-4208-BF66-A8BB341FD669}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "OE.TenTrees.Shared", "Shared\OE.TenTrees.Shared.csproj", "{18D73F73-D7BE-4388-85BA-FBD9AC96FCA2}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {04B05448-788F-433D-92C0-FED35122D45A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {04B05448-788F-433D-92C0-FED35122D45A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {04B05448-788F-433D-92C0-FED35122D45A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {04B05448-788F-433D-92C0-FED35122D45A}.Release|Any CPU.Build.0 = Release|Any CPU + {AA8E58A1-CD09-4208-BF66-A8BB341FD669}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {AA8E58A1-CD09-4208-BF66-A8BB341FD669}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AA8E58A1-CD09-4208-BF66-A8BB341FD669}.Release|Any CPU.ActiveCfg = Release|Any CPU + {AA8E58A1-CD09-4208-BF66-A8BB341FD669}.Release|Any CPU.Build.0 = Release|Any CPU + {18D73F73-D7BE-4388-85BA-FBD9AC96FCA2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {18D73F73-D7BE-4388-85BA-FBD9AC96FCA2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {18D73F73-D7BE-4388-85BA-FBD9AC96FCA2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {18D73F73-D7BE-4388-85BA-FBD9AC96FCA2}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal \ No newline at end of file diff --git a/README.md b/README.md index 832ba0a..f40cd5d 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,180 @@ -# TenTrees -Ten Trees database and mobile forms +# OE.TenTrees Oqtane Module + +A comprehensive Oqtane module for managing tree planting and conservation efforts as part of the Ten Trees project. + +## Overview + +The OE.TenTrees module provides a complete solution for: + +- **Tree Management**: Track individual trees with species, location, health status, and measurements +- **Planting Events**: Organize and record tree planting events with location and participant details +- **Tree Monitoring**: Monitor tree health and growth over time with regular check-ins +- **Dashboard**: View comprehensive statistics and recent tree activity +- **Settings**: Configure default locations and module behavior + +## Architecture + +This module follows the standard Oqtane architecture pattern with three main projects: + +### Shared (`OE.TenTrees.Shared`) +Contains the data models shared between client and server: + +- **Tree**: Individual tree records with species, location, health status +- **PlantingEvent**: Tree planting event organization and tracking +- **TreeMonitoring**: Health monitoring and growth tracking records + +### Client (`OE.TenTrees.Client`) +Blazor WebAssembly client components: + +- **Index.razor**: Dashboard view with statistics and recent trees +- **Edit.razor**: Form for adding/editing tree records +- **Settings.razor**: Module configuration +- **Services**: Client-side services for API communication + +### Server (`OE.TenTrees.Server`) +ASP.NET Core server components: + +- **Controllers**: API endpoints for trees and planting events +- **Repositories**: Data access layer with Entity Framework +- **Migrations**: Database schema management +- **Manager**: Module installation and management + +## Features + +### Core Models + +#### Tree +- Species (scientific name) +- Common name +- GPS coordinates (latitude/longitude) +- Location description +- Planting date and person who planted +- Current health status +- Physical measurements (height, diameter) +- Notes and observations + +#### Planting Event +- Event name and description +- Date and location +- Number of trees planted +- Organizer and sponsor information +- Participant count +- Event notes + +#### Tree Monitoring +- Reference to specific tree +- Monitoring date +- Health status assessment +- Growth measurements +- Observations and photos +- Action recommendations + +### User Interface + +#### Dashboard (Index) +- Statistics cards showing total trees, events, and healthy trees +- Recent trees table with key information +- Quick navigation to management functions +- Responsive design for mobile and desktop + +#### Tree Management (Edit) +- Comprehensive form for tree data entry +- GPS coordinate input +- Health status selection +- File upload support for photos +- Validation and error handling + +#### Module Settings +- Default location and coordinates +- Notification preferences +- Organization information +- Customizable module behavior + +## Installation + +This module is designed to be installed in an existing Oqtane installation: + +1. Copy the module files to your Oqtane installation +2. The module will be automatically detected and available for installation +3. Install the module through the Oqtane admin interface +4. Add the module to any page where you want tree management functionality + +## Database Schema + +The module creates the following database tables: + +- `OETenTreesTree`: Individual tree records +- `OETenTreesPlantingEvent`: Tree planting events +- `OETenTreesTreeMonitoring`: Tree monitoring records + +All tables include audit fields (CreatedBy, CreatedOn, ModifiedBy, ModifiedOn) for tracking changes. + +## API Endpoints + +### Trees +- `GET /api/Tree?moduleid={id}` - Get all trees for a module +- `GET /api/Tree/{id}?moduleid={id}` - Get specific tree +- `POST /api/Tree` - Create new tree +- `PUT /api/Tree/{id}` - Update tree +- `DELETE /api/Tree/{id}?moduleid={id}` - Delete tree + +### Planting Events +- `GET /api/PlantingEvent?moduleid={id}` - Get all events for a module +- `GET /api/PlantingEvent/{id}?moduleid={id}` - Get specific event +- `POST /api/PlantingEvent` - Create new event +- `PUT /api/PlantingEvent/{id}` - Update event +- `DELETE /api/PlantingEvent/{id}?moduleid={id}` - Delete event + +## Security + +The module implements Oqtane's standard security model: + +- **View**: Users can view tree information +- **Edit**: Users can create, update, and delete trees and events +- **Admin**: Full access to all module functionality + +## Localization + +The module is designed to support multiple languages through Oqtane's localization system. Resource keys are used throughout the UI components for easy translation. + +## Development Notes + +### Framework Versions +- Built for .NET 8.0 +- Uses Oqtane.Client, Oqtane.Server, and Oqtane.Shared packages version 5.2.4 +- Compatible with Entity Framework Core 8.0 + +### Dependencies +- Oqtane Framework 5.2.4+ +- Microsoft.EntityFrameworkCore.SqlServer +- Microsoft.AspNetCore.Components + +### Building +This module is designed to be built as part of an Oqtane installation rather than as a standalone project. The build process requires the full Oqtane framework context. + +## Ten Trees Project Integration + +This module is specifically designed for the Ten Trees environmental conservation project mentioned in the requirements. It provides the necessary tools for: + +- Tracking community tree planting efforts +- Monitoring tree health and survival rates +- Organizing community planting events +- Maintaining records for environmental impact reporting +- Supporting conservation education and outreach + +## Contributing + +To contribute to this module: + +1. Ensure you have a working Oqtane development environment +2. Follow Oqtane module development best practices +3. Test thoroughly with various tree data scenarios +4. Submit pull requests with clear descriptions of changes + +## License + +This module is released under the same license as the parent repository. + +## Support + +For support with this module, please refer to the Oqtane documentation and community forums for general framework questions, and create issues in this repository for module-specific problems. diff --git a/Server/Controllers/PlantingEventController.cs b/Server/Controllers/PlantingEventController.cs new file mode 100644 index 0000000..bea4650 --- /dev/null +++ b/Server/Controllers/PlantingEventController.cs @@ -0,0 +1,123 @@ +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Authorization; +using System.Collections.Generic; +using System.Threading.Tasks; +using Oqtane.Shared; +using Oqtane.Enums; +using Oqtane.Infrastructure; +using OE.TenTrees.Models; +using OE.TenTrees.Repository; + +namespace OE.TenTrees.Controllers +{ + [Route(ControllerRoutes.ApiRoute)] + public class PlantingEventController : Controller + { + private readonly IPlantingEventRepository _PlantingEventRepository; + private readonly ILogManager _logger; + + public PlantingEventController(IPlantingEventRepository PlantingEventRepository, ILogManager logger) + { + _PlantingEventRepository = PlantingEventRepository; + _logger = logger; + } + + // GET: api/?moduleid=x + [HttpGet] + [Authorize(Policy = PolicyNames.ViewModule)] + public async Task> Get(string moduleid) + { + int ModuleId; + if (int.TryParse(moduleid, out ModuleId) && IsAuthorized(EntityNames.Module, ModuleId, PermissionNames.View)) + { + return await _PlantingEventRepository.GetPlantingEventsAsync(ModuleId); + } + else + { + _logger.Log(LogLevel.Error, this, LogFunction.Security, "Unauthorized PlantingEvent Get Attempt {ModuleId}", moduleid); + HttpContext.Response.StatusCode = (int)System.Net.HttpStatusCode.Forbidden; + return new List(); + } + } + + // GET api//5?moduleid=x + [HttpGet("{id}")] + [Authorize(Policy = PolicyNames.ViewModule)] + public async Task Get(int id, string moduleid) + { + int ModuleId; + if (int.TryParse(moduleid, out ModuleId) && IsAuthorized(EntityNames.Module, ModuleId, PermissionNames.View)) + { + return await _PlantingEventRepository.GetPlantingEventAsync(id, ModuleId); + } + else + { + _logger.Log(LogLevel.Error, this, LogFunction.Security, "Unauthorized PlantingEvent Get Attempt {PlantingEventId} {ModuleId}", id, moduleid); + HttpContext.Response.StatusCode = (int)System.Net.HttpStatusCode.Forbidden; + return null; + } + } + + // POST api/ + [HttpPost] + [Authorize(Policy = PolicyNames.EditModule)] + public async Task Post([FromBody] PlantingEvent PlantingEvent) + { + if (ModelState.IsValid && IsAuthorized(EntityNames.Module, PlantingEvent.ModuleId, PermissionNames.Edit)) + { + PlantingEvent = await _PlantingEventRepository.AddPlantingEventAsync(PlantingEvent); + _logger.Log(LogLevel.Information, this, LogFunction.Create, "PlantingEvent Added {PlantingEvent}", PlantingEvent); + } + else + { + _logger.Log(LogLevel.Error, this, LogFunction.Security, "Unauthorized PlantingEvent Post Attempt {PlantingEvent}", PlantingEvent); + HttpContext.Response.StatusCode = (int)System.Net.HttpStatusCode.Forbidden; + PlantingEvent = null; + } + return PlantingEvent; + } + + // PUT api//5 + [HttpPut("{id}")] + [Authorize(Policy = PolicyNames.EditModule)] + public async Task Put(int id, [FromBody] PlantingEvent PlantingEvent) + { + if (ModelState.IsValid && PlantingEvent.PlantingEventId == id && IsAuthorized(EntityNames.Module, PlantingEvent.ModuleId, PermissionNames.Edit)) + { + PlantingEvent = await _PlantingEventRepository.UpdatePlantingEventAsync(PlantingEvent); + _logger.Log(LogLevel.Information, this, LogFunction.Update, "PlantingEvent Updated {PlantingEvent}", PlantingEvent); + } + else + { + _logger.Log(LogLevel.Error, this, LogFunction.Security, "Unauthorized PlantingEvent Put Attempt {PlantingEvent}", PlantingEvent); + HttpContext.Response.StatusCode = (int)System.Net.HttpStatusCode.Forbidden; + PlantingEvent = null; + } + return PlantingEvent; + } + + // DELETE api//5?moduleid=x + [HttpDelete("{id}")] + [Authorize(Policy = PolicyNames.EditModule)] + public async Task Delete(int id, string moduleid) + { + int ModuleId; + if (int.TryParse(moduleid, out ModuleId) && IsAuthorized(EntityNames.Module, ModuleId, PermissionNames.Edit)) + { + await _PlantingEventRepository.DeletePlantingEventAsync(id, ModuleId); + _logger.Log(LogLevel.Information, this, LogFunction.Delete, "PlantingEvent Deleted {PlantingEventId}", id); + } + else + { + _logger.Log(LogLevel.Error, this, LogFunction.Security, "Unauthorized PlantingEvent Delete Attempt {PlantingEventId} {ModuleId}", id, moduleid); + HttpContext.Response.StatusCode = (int)System.Net.HttpStatusCode.Forbidden; + } + } + + private bool IsAuthorized(string entityName, int entityId, string permissionName) + { + return User.IsInRole(RoleNames.Admin) || + UserPermissions.IsAuthorized(User, entityName, entityId, permissionName); + } + } +} \ No newline at end of file diff --git a/Server/Controllers/TreeController.cs b/Server/Controllers/TreeController.cs new file mode 100644 index 0000000..f35357c --- /dev/null +++ b/Server/Controllers/TreeController.cs @@ -0,0 +1,123 @@ +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Authorization; +using System.Collections.Generic; +using System.Threading.Tasks; +using Oqtane.Shared; +using Oqtane.Enums; +using Oqtane.Infrastructure; +using OE.TenTrees.Models; +using OE.TenTrees.Repository; + +namespace OE.TenTrees.Controllers +{ + [Route(ControllerRoutes.ApiRoute)] + public class TreeController : Controller + { + private readonly ITreeRepository _TreeRepository; + private readonly ILogManager _logger; + + public TreeController(ITreeRepository TreeRepository, ILogManager logger) + { + _TreeRepository = TreeRepository; + _logger = logger; + } + + // GET: api/?moduleid=x + [HttpGet] + [Authorize(Policy = PolicyNames.ViewModule)] + public async Task> Get(string moduleid) + { + int ModuleId; + if (int.TryParse(moduleid, out ModuleId) && IsAuthorized(EntityNames.Module, ModuleId, PermissionNames.View)) + { + return await _TreeRepository.GetTreesAsync(ModuleId); + } + else + { + _logger.Log(LogLevel.Error, this, LogFunction.Security, "Unauthorized Tree Get Attempt {ModuleId}", moduleid); + HttpContext.Response.StatusCode = (int)System.Net.HttpStatusCode.Forbidden; + return new List(); + } + } + + // GET api//5?moduleid=x + [HttpGet("{id}")] + [Authorize(Policy = PolicyNames.ViewModule)] + public async Task Get(int id, string moduleid) + { + int ModuleId; + if (int.TryParse(moduleid, out ModuleId) && IsAuthorized(EntityNames.Module, ModuleId, PermissionNames.View)) + { + return await _TreeRepository.GetTreeAsync(id, ModuleId); + } + else + { + _logger.Log(LogLevel.Error, this, LogFunction.Security, "Unauthorized Tree Get Attempt {TreeId} {ModuleId}", id, moduleid); + HttpContext.Response.StatusCode = (int)System.Net.HttpStatusCode.Forbidden; + return null; + } + } + + // POST api/ + [HttpPost] + [Authorize(Policy = PolicyNames.EditModule)] + public async Task Post([FromBody] Tree Tree) + { + if (ModelState.IsValid && IsAuthorized(EntityNames.Module, Tree.ModuleId, PermissionNames.Edit)) + { + Tree = await _TreeRepository.AddTreeAsync(Tree); + _logger.Log(LogLevel.Information, this, LogFunction.Create, "Tree Added {Tree}", Tree); + } + else + { + _logger.Log(LogLevel.Error, this, LogFunction.Security, "Unauthorized Tree Post Attempt {Tree}", Tree); + HttpContext.Response.StatusCode = (int)System.Net.HttpStatusCode.Forbidden; + Tree = null; + } + return Tree; + } + + // PUT api//5 + [HttpPut("{id}")] + [Authorize(Policy = PolicyNames.EditModule)] + public async Task Put(int id, [FromBody] Tree Tree) + { + if (ModelState.IsValid && Tree.TreeId == id && IsAuthorized(EntityNames.Module, Tree.ModuleId, PermissionNames.Edit)) + { + Tree = await _TreeRepository.UpdateTreeAsync(Tree); + _logger.Log(LogLevel.Information, this, LogFunction.Update, "Tree Updated {Tree}", Tree); + } + else + { + _logger.Log(LogLevel.Error, this, LogFunction.Security, "Unauthorized Tree Put Attempt {Tree}", Tree); + HttpContext.Response.StatusCode = (int)System.Net.HttpStatusCode.Forbidden; + Tree = null; + } + return Tree; + } + + // DELETE api//5?moduleid=x + [HttpDelete("{id}")] + [Authorize(Policy = PolicyNames.EditModule)] + public async Task Delete(int id, string moduleid) + { + int ModuleId; + if (int.TryParse(moduleid, out ModuleId) && IsAuthorized(EntityNames.Module, ModuleId, PermissionNames.Edit)) + { + await _TreeRepository.DeleteTreeAsync(id, ModuleId); + _logger.Log(LogLevel.Information, this, LogFunction.Delete, "Tree Deleted {TreeId}", id); + } + else + { + _logger.Log(LogLevel.Error, this, LogFunction.Security, "Unauthorized Tree Delete Attempt {TreeId} {ModuleId}", id, moduleid); + HttpContext.Response.StatusCode = (int)System.Net.HttpStatusCode.Forbidden; + } + } + + private bool IsAuthorized(string entityName, int entityId, string permissionName) + { + return User.IsInRole(RoleNames.Admin) || + UserPermissions.IsAuthorized(User, entityName, entityId, permissionName); + } + } +} \ No newline at end of file diff --git a/Server/Manager/TenTreesManager.cs b/Server/Manager/TenTreesManager.cs new file mode 100644 index 0000000..5af8e53 --- /dev/null +++ b/Server/Manager/TenTreesManager.cs @@ -0,0 +1,80 @@ +using System.Collections.Generic; +using System.Linq; +using System.Text.Json; +using Oqtane.Modules; +using Oqtane.Models; +using Oqtane.Infrastructure; +using Oqtane.Interfaces; +using OE.TenTrees.Repository; + +namespace OE.TenTrees.Manager +{ + public class TenTreesManager : MigratableModuleBase, IInstallable, IPortable, ISearchable + { + private readonly ITenTreesRepository _TenTreesRepository; + + public TenTreesManager(ITenTreesRepository TenTreesRepository) + { + _TenTreesRepository = TenTreesRepository; + } + + public bool Install(Tenant tenant, string version) + { + return Migrate(tenant, MigrationType.Up, version); + } + + public bool Uninstall(Tenant tenant) + { + return Migrate(tenant, MigrationType.Down, "1.0.0"); + } + + public string ExportModule(Oqtane.Models.Module module) + { + string content = ""; + var trees = _TenTreesRepository.GetTrees(module.ModuleId); + if (trees != null) + { + content = JsonSerializer.Serialize(trees); + } + return content; + } + + public void ImportModule(Oqtane.Models.Module module, string content, string version) + { + var trees = JsonSerializer.Deserialize>(content); + if (trees != null) + { + foreach(var tree in trees) + { + tree.ModuleId = module.ModuleId; + _TenTreesRepository.AddTree(tree); + } + } + } + + public List GetSearchContents(Oqtane.Models.Module module, DateTime lastIndexedOn) + { + var searchContentList = new List(); + + var trees = _TenTreesRepository.GetTrees(module.ModuleId); + foreach (var tree in trees) + { + if (tree.ModifiedOn >= lastIndexedOn) + { + var searchContent = new SearchContent + { + EntityName = "OETenTreesTree", + EntityId = tree.TreeId.ToString(), + Title = $"{tree.Species} - {tree.CommonName}", + Body = $"{tree.Location} {tree.Notes}", + ContentModifiedBy = tree.ModifiedBy, + ContentModifiedOn = tree.ModifiedOn + }; + searchContentList.Add(searchContent); + } + } + + return searchContentList; + } + } +} \ No newline at end of file diff --git a/Server/Migrations/01000000_InitializeModule.cs b/Server/Migrations/01000000_InitializeModule.cs new file mode 100644 index 0000000..29a8527 --- /dev/null +++ b/Server/Migrations/01000000_InitializeModule.cs @@ -0,0 +1,42 @@ +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Oqtane.Databases.Interfaces; +using Oqtane.Migrations; +using OE.TenTrees.Migrations.EntityBuilders; +using OE.TenTrees.Repository; + +namespace OE.TenTrees.Migrations +{ + [DbContext(typeof(TenTreesContext))] + [Migration("01.00.00.00")] + public class InitializeModule : MultiDatabaseMigration + { + public InitializeModule(IDatabase database) : base(database) + { + } + + protected override void Up(MigrationBuilder migrationBuilder) + { + var entityBuilder = new TreeEntityBuilder(migrationBuilder, ActiveDatabase); + entityBuilder.Create(); + + var plantingEventEntityBuilder = new PlantingEventEntityBuilder(migrationBuilder, ActiveDatabase); + plantingEventEntityBuilder.Create(); + + var treeMonitoringEntityBuilder = new TreeMonitoringEntityBuilder(migrationBuilder, ActiveDatabase); + treeMonitoringEntityBuilder.Create(); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + var entityBuilder = new TreeEntityBuilder(migrationBuilder, ActiveDatabase); + entityBuilder.Drop(); + + var plantingEventEntityBuilder = new PlantingEventEntityBuilder(migrationBuilder, ActiveDatabase); + plantingEventEntityBuilder.Drop(); + + var treeMonitoringEntityBuilder = new TreeMonitoringEntityBuilder(migrationBuilder, ActiveDatabase); + treeMonitoringEntityBuilder.Drop(); + } + } +} \ No newline at end of file diff --git a/Server/Migrations/EntityBuilders/PlantingEventEntityBuilder.cs b/Server/Migrations/EntityBuilders/PlantingEventEntityBuilder.cs new file mode 100644 index 0000000..476d3b4 --- /dev/null +++ b/Server/Migrations/EntityBuilders/PlantingEventEntityBuilder.cs @@ -0,0 +1,54 @@ +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore; +using Oqtane.Databases.Interfaces; +using Oqtane.Migrations.EntityBuilders; + +namespace OE.TenTrees.Migrations.EntityBuilders +{ + public class PlantingEventEntityBuilder : AuditableBaseEntityBuilder + { + private const string _entityTableName = "OETenTreesPlantingEvent"; + private readonly PrimaryKey _primaryKey = new("PlantingEventId"); + + public PlantingEventEntityBuilder(MigrationBuilder migrationBuilder, IDatabase database) : base(migrationBuilder, database) + { + EntityTableName = _entityTableName; + PrimaryKey = _primaryKey; + } + + protected override PlantingEventEntityBuilder BuildTable(ColumnsBuilder table) + { + PlantingEventId = AddAutoIncrementColumn(table,"PlantingEventId"); + ModuleId = AddIntegerColumn(table,"ModuleId"); + EventName = AddStringColumn(table,"EventName", 100, false); + PlantingDate = AddDateTimeColumn(table,"PlantingDate", false); + Latitude = AddDoubleColumn(table,"Latitude", false); + Longitude = AddDoubleColumn(table,"Longitude", false); + Location = AddStringColumn(table,"Location", 200); + TreesPlanted = AddIntegerColumn(table,"TreesPlanted", false); + Description = AddStringColumn(table,"Description", 500); + Organizer = AddStringColumn(table,"Organizer", 100); + Sponsor = AddStringColumn(table,"Sponsor", 100); + ParticipantCount = AddIntegerColumn(table,"ParticipantCount"); + Notes = AddStringColumn(table,"Notes", 1000); + + AddAuditableColumns(table); + + return this; + } + + public OperationBuilder PlantingEventId { get; set; } + public OperationBuilder ModuleId { get; set; } + public OperationBuilder EventName { get; set; } + public OperationBuilder PlantingDate { get; set; } + public OperationBuilder Latitude { get; set; } + public OperationBuilder Longitude { get; set; } + public OperationBuilder Location { get; set; } + public OperationBuilder TreesPlanted { get; set; } + public OperationBuilder Description { get; set; } + public OperationBuilder Organizer { get; set; } + public OperationBuilder Sponsor { get; set; } + public OperationBuilder ParticipantCount { get; set; } + public OperationBuilder Notes { get; set; } + } +} \ No newline at end of file diff --git a/Server/Migrations/EntityBuilders/TreeEntityBuilder.cs b/Server/Migrations/EntityBuilders/TreeEntityBuilder.cs new file mode 100644 index 0000000..ae94b3a --- /dev/null +++ b/Server/Migrations/EntityBuilders/TreeEntityBuilder.cs @@ -0,0 +1,54 @@ +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore; +using Oqtane.Databases.Interfaces; +using Oqtane.Migrations.EntityBuilders; + +namespace OE.TenTrees.Migrations.EntityBuilders +{ + public class TreeEntityBuilder : AuditableBaseEntityBuilder + { + private const string _entityTableName = "OETenTreesTree"; + private readonly PrimaryKey _primaryKey = new("TreeId"); + + public TreeEntityBuilder(MigrationBuilder migrationBuilder, IDatabase database) : base(migrationBuilder, database) + { + EntityTableName = _entityTableName; + PrimaryKey = _primaryKey; + } + + protected override TreeEntityBuilder BuildTable(ColumnsBuilder table) + { + TreeId = AddAutoIncrementColumn(table,"TreeId"); + ModuleId = AddIntegerColumn(table,"ModuleId"); + Species = AddStringColumn(table,"Species", 100, false); + CommonName = AddStringColumn(table,"CommonName", 100); + Latitude = AddDoubleColumn(table,"Latitude", false); + Longitude = AddDoubleColumn(table,"Longitude", false); + Location = AddStringColumn(table,"Location", 200); + PlantedDate = AddDateTimeColumn(table,"PlantedDate", false); + Status = AddStringColumn(table,"Status", 50, false, "Healthy"); + Notes = AddStringColumn(table,"Notes", 500); + Height = AddDoubleColumn(table,"Height"); + Diameter = AddDoubleColumn(table,"Diameter"); + PlantedBy = AddStringColumn(table,"PlantedBy", 100); + + AddAuditableColumns(table); + + return this; + } + + public OperationBuilder TreeId { get; set; } + public OperationBuilder ModuleId { get; set; } + public OperationBuilder Species { get; set; } + public OperationBuilder CommonName { get; set; } + public OperationBuilder Latitude { get; set; } + public OperationBuilder Longitude { get; set; } + public OperationBuilder Location { get; set; } + public OperationBuilder PlantedDate { get; set; } + public OperationBuilder Status { get; set; } + public OperationBuilder Notes { get; set; } + public OperationBuilder Height { get; set; } + public OperationBuilder Diameter { get; set; } + public OperationBuilder PlantedBy { get; set; } + } +} \ No newline at end of file diff --git a/Server/Migrations/EntityBuilders/TreeMonitoringEntityBuilder.cs b/Server/Migrations/EntityBuilders/TreeMonitoringEntityBuilder.cs new file mode 100644 index 0000000..7ec8c67 --- /dev/null +++ b/Server/Migrations/EntityBuilders/TreeMonitoringEntityBuilder.cs @@ -0,0 +1,52 @@ +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore; +using Oqtane.Databases.Interfaces; +using Oqtane.Migrations.EntityBuilders; + +namespace OE.TenTrees.Migrations.EntityBuilders +{ + public class TreeMonitoringEntityBuilder : AuditableBaseEntityBuilder + { + private const string _entityTableName = "OETenTreesTreeMonitoring"; + private readonly PrimaryKey _primaryKey = new("TreeMonitoringId"); + + public TreeMonitoringEntityBuilder(MigrationBuilder migrationBuilder, IDatabase database) : base(migrationBuilder, database) + { + EntityTableName = _entityTableName; + PrimaryKey = _primaryKey; + } + + protected override TreeMonitoringEntityBuilder BuildTable(ColumnsBuilder table) + { + TreeMonitoringId = AddAutoIncrementColumn(table,"TreeMonitoringId"); + ModuleId = AddIntegerColumn(table,"ModuleId"); + TreeId = AddIntegerColumn(table,"TreeId", false); + MonitoringDate = AddDateTimeColumn(table,"MonitoringDate", false); + HealthStatus = AddStringColumn(table,"HealthStatus", 50, false, "Healthy"); + Height = AddDoubleColumn(table,"Height"); + Diameter = AddDoubleColumn(table,"Diameter"); + Observations = AddStringColumn(table,"Observations", 500); + MonitoredBy = AddStringColumn(table,"MonitoredBy", 100); + PhotoUrl = AddStringColumn(table,"PhotoUrl", 200); + RequiresAttention = AddBooleanColumn(table,"RequiresAttention", false, false); + RecommendedActions = AddStringColumn(table,"RecommendedActions", 300); + + AddAuditableColumns(table); + + return this; + } + + public OperationBuilder TreeMonitoringId { get; set; } + public OperationBuilder ModuleId { get; set; } + public OperationBuilder TreeId { get; set; } + public OperationBuilder MonitoringDate { get; set; } + public OperationBuilder HealthStatus { get; set; } + public OperationBuilder Height { get; set; } + public OperationBuilder Diameter { get; set; } + public OperationBuilder Observations { get; set; } + public OperationBuilder MonitoredBy { get; set; } + public OperationBuilder PhotoUrl { get; set; } + public OperationBuilder RequiresAttention { get; set; } + public OperationBuilder RecommendedActions { get; set; } + } +} \ No newline at end of file diff --git a/Server/OE.TenTrees.Server.csproj b/Server/OE.TenTrees.Server.csproj new file mode 100644 index 0000000..6ca6f5b --- /dev/null +++ b/Server/OE.TenTrees.Server.csproj @@ -0,0 +1,24 @@ + + + + net8.0 + 1.0.0 + OE.TenTrees.Server.Oqtane + true + none + false + false + enable + enable + + + + + + + + + + + + \ No newline at end of file diff --git a/Server/Program.cs b/Server/Program.cs new file mode 100644 index 0000000..8450940 --- /dev/null +++ b/Server/Program.cs @@ -0,0 +1,22 @@ +using Microsoft.AspNetCore.Hosting; +using Microsoft.Extensions.Hosting; +using Oqtane.Infrastructure; + +namespace OE.TenTrees +{ + public class Program + { + public static void Main(string[] args) + { + CreateHostBuilder(args).Build().Run(); + } + + public static IHostBuilder CreateHostBuilder(string[] args) => + Host.CreateDefaultBuilder(args) + .ConfigureWebHostDefaults(webBuilder => + { + webBuilder.UseStartup(); + webBuilder.UseOqtane(); + }); + } +} \ No newline at end of file diff --git a/Server/Repository/IPlantingEventRepository.cs b/Server/Repository/IPlantingEventRepository.cs new file mode 100644 index 0000000..09a7654 --- /dev/null +++ b/Server/Repository/IPlantingEventRepository.cs @@ -0,0 +1,15 @@ +using System.Collections.Generic; +using System.Threading.Tasks; +using OE.TenTrees.Models; + +namespace OE.TenTrees.Repository +{ + public interface IPlantingEventRepository + { + Task> GetPlantingEventsAsync(int ModuleId); + Task GetPlantingEventAsync(int PlantingEventId, int ModuleId); + Task AddPlantingEventAsync(PlantingEvent plantingEvent); + Task UpdatePlantingEventAsync(PlantingEvent plantingEvent); + Task DeletePlantingEventAsync(int PlantingEventId, int ModuleId); + } +} \ No newline at end of file diff --git a/Server/Repository/ITenTreesRepository.cs b/Server/Repository/ITenTreesRepository.cs new file mode 100644 index 0000000..fde781d --- /dev/null +++ b/Server/Repository/ITenTreesRepository.cs @@ -0,0 +1,11 @@ +using System.Collections.Generic; +using OE.TenTrees.Models; + +namespace OE.TenTrees.Repository +{ + public interface ITenTreesRepository + { + IEnumerable GetTrees(int ModuleId); + Tree AddTree(Tree tree); + } +} \ No newline at end of file diff --git a/Server/Repository/ITreeRepository.cs b/Server/Repository/ITreeRepository.cs new file mode 100644 index 0000000..a788b47 --- /dev/null +++ b/Server/Repository/ITreeRepository.cs @@ -0,0 +1,15 @@ +using System.Collections.Generic; +using System.Threading.Tasks; +using OE.TenTrees.Models; + +namespace OE.TenTrees.Repository +{ + public interface ITreeRepository + { + Task> GetTreesAsync(int ModuleId); + Task GetTreeAsync(int TreeId, int ModuleId); + Task AddTreeAsync(Tree tree); + Task UpdateTreeAsync(Tree tree); + Task DeleteTreeAsync(int TreeId, int ModuleId); + } +} \ No newline at end of file diff --git a/Server/Repository/PlantingEventRepository.cs b/Server/Repository/PlantingEventRepository.cs new file mode 100644 index 0000000..1d61ea6 --- /dev/null +++ b/Server/Repository/PlantingEventRepository.cs @@ -0,0 +1,58 @@ +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.EntityFrameworkCore; +using Oqtane.Modules; +using OE.TenTrees.Models; + +namespace OE.TenTrees.Repository +{ + public class PlantingEventRepository : IPlantingEventRepository, ITransientService + { + private readonly IDbContextFactory _factory; + + public PlantingEventRepository(IDbContextFactory factory) + { + _factory = factory; + } + + public async Task> GetPlantingEventsAsync(int ModuleId) + { + using var db = _factory.CreateDbContext(); + return await db.PlantingEvent.Where(item => item.ModuleId == ModuleId).ToListAsync(); + } + + public async Task GetPlantingEventAsync(int PlantingEventId, int ModuleId) + { + using var db = _factory.CreateDbContext(); + return await db.PlantingEvent.Where(item => item.PlantingEventId == PlantingEventId && item.ModuleId == ModuleId).FirstOrDefaultAsync(); + } + + public async Task AddPlantingEventAsync(PlantingEvent plantingEvent) + { + using var db = _factory.CreateDbContext(); + db.PlantingEvent.Add(plantingEvent); + await db.SaveChangesAsync(); + return plantingEvent; + } + + public async Task UpdatePlantingEventAsync(PlantingEvent plantingEvent) + { + using var db = _factory.CreateDbContext(); + db.Entry(plantingEvent).State = EntityState.Modified; + await db.SaveChangesAsync(); + return plantingEvent; + } + + public async Task DeletePlantingEventAsync(int PlantingEventId, int ModuleId) + { + using var db = _factory.CreateDbContext(); + var plantingEvent = await db.PlantingEvent.Where(item => item.PlantingEventId == PlantingEventId && item.ModuleId == ModuleId).FirstOrDefaultAsync(); + if (plantingEvent != null) + { + db.PlantingEvent.Remove(plantingEvent); + await db.SaveChangesAsync(); + } + } + } +} \ No newline at end of file diff --git a/Server/Repository/TenTreesContext.cs b/Server/Repository/TenTreesContext.cs new file mode 100644 index 0000000..c901bf1 --- /dev/null +++ b/Server/Repository/TenTreesContext.cs @@ -0,0 +1,28 @@ +using Microsoft.EntityFrameworkCore; +using OE.TenTrees.Models; +using Oqtane.Modules; +using Oqtane.Repository; + +namespace OE.TenTrees.Repository +{ + public class TenTreesContext : DBContextBase, ITransientService, IMultiDatabase + { + public virtual DbSet Tree { get; set; } + public virtual DbSet PlantingEvent { get; set; } + public virtual DbSet TreeMonitoring { get; set; } + + public TenTreesContext(IDBContextDependencies DBContextDependencies) : base(DBContextDependencies) + { + // ContextBase handles multi-tenant database connections + } + + protected override void OnModelCreating(ModelBuilder builder) + { + base.OnModelCreating(builder); + + builder.Entity().ToTable(ActiveDatabase.RewriteName("OETenTreesTree")); + builder.Entity().ToTable(ActiveDatabase.RewriteName("OETenTreesPlantingEvent")); + builder.Entity().ToTable(ActiveDatabase.RewriteName("OETenTreesTreeMonitoring")); + } + } +} \ No newline at end of file diff --git a/Server/Repository/TenTreesRepository.cs b/Server/Repository/TenTreesRepository.cs new file mode 100644 index 0000000..5eea5bc --- /dev/null +++ b/Server/Repository/TenTreesRepository.cs @@ -0,0 +1,32 @@ +using System.Collections.Generic; +using System.Linq; +using Microsoft.EntityFrameworkCore; +using Oqtane.Modules; +using OE.TenTrees.Models; + +namespace OE.TenTrees.Repository +{ + public class TenTreesRepository : ITenTreesRepository, ITransientService + { + private readonly IDbContextFactory _factory; + + public TenTreesRepository(IDbContextFactory factory) + { + _factory = factory; + } + + public IEnumerable GetTrees(int ModuleId) + { + using var db = _factory.CreateDbContext(); + return db.Tree.Where(item => item.ModuleId == ModuleId).ToList(); + } + + public Tree AddTree(Tree tree) + { + using var db = _factory.CreateDbContext(); + db.Tree.Add(tree); + db.SaveChanges(); + return tree; + } + } +} \ No newline at end of file diff --git a/Server/Repository/TreeRepository.cs b/Server/Repository/TreeRepository.cs new file mode 100644 index 0000000..2c3d186 --- /dev/null +++ b/Server/Repository/TreeRepository.cs @@ -0,0 +1,58 @@ +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.EntityFrameworkCore; +using Oqtane.Modules; +using OE.TenTrees.Models; + +namespace OE.TenTrees.Repository +{ + public class TreeRepository : ITreeRepository, ITransientService + { + private readonly IDbContextFactory _factory; + + public TreeRepository(IDbContextFactory factory) + { + _factory = factory; + } + + public async Task> GetTreesAsync(int ModuleId) + { + using var db = _factory.CreateDbContext(); + return await db.Tree.Where(item => item.ModuleId == ModuleId).ToListAsync(); + } + + public async Task GetTreeAsync(int TreeId, int ModuleId) + { + using var db = _factory.CreateDbContext(); + return await db.Tree.Where(item => item.TreeId == TreeId && item.ModuleId == ModuleId).FirstOrDefaultAsync(); + } + + public async Task AddTreeAsync(Tree tree) + { + using var db = _factory.CreateDbContext(); + db.Tree.Add(tree); + await db.SaveChangesAsync(); + return tree; + } + + public async Task UpdateTreeAsync(Tree tree) + { + using var db = _factory.CreateDbContext(); + db.Entry(tree).State = EntityState.Modified; + await db.SaveChangesAsync(); + return tree; + } + + public async Task DeleteTreeAsync(int TreeId, int ModuleId) + { + using var db = _factory.CreateDbContext(); + var tree = await db.Tree.Where(item => item.TreeId == TreeId && item.ModuleId == ModuleId).FirstOrDefaultAsync(); + if (tree != null) + { + db.Tree.Remove(tree); + await db.SaveChangesAsync(); + } + } + } +} \ No newline at end of file diff --git a/Server/Startup.cs b/Server/Startup.cs new file mode 100644 index 0000000..8a47980 --- /dev/null +++ b/Server/Startup.cs @@ -0,0 +1,20 @@ +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Hosting; +using Microsoft.Extensions.DependencyInjection; +using Oqtane.Infrastructure; + +namespace OE.TenTrees +{ + public class Startup + { + public void ConfigureServices(IServiceCollection services) + { + services.AddOqtane(); + } + + public void Configure(IApplicationBuilder app, IWebHostEnvironment env) + { + app.UseOqtane(env); + } + } +} \ No newline at end of file diff --git a/Server/appsettings.json b/Server/appsettings.json new file mode 100644 index 0000000..f7f873d --- /dev/null +++ b/Server/appsettings.json @@ -0,0 +1,18 @@ +{ + "ConnectionStrings": { + "DefaultConnection": "Data Source=|DataDirectory|\\Oqtane.db;", + "LocalDBConnection": "Server=(LocalDB)\\MSSQLLocalDB;Integrated Security=true;" + }, + "Installation": { + "ConnectionString": "", + "Aliases": "" + }, + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + }, + "AllowedHosts": "*", + "Runtime": "Hybrid" +} \ No newline at end of file diff --git a/Server/obj/Debug/net8.0/OE.TenTrees.Server.GlobalUsings.g.cs b/Server/obj/Debug/net8.0/OE.TenTrees.Server.GlobalUsings.g.cs new file mode 100644 index 0000000..025530a --- /dev/null +++ b/Server/obj/Debug/net8.0/OE.TenTrees.Server.GlobalUsings.g.cs @@ -0,0 +1,17 @@ +// +global using global::Microsoft.AspNetCore.Builder; +global using global::Microsoft.AspNetCore.Hosting; +global using global::Microsoft.AspNetCore.Http; +global using global::Microsoft.AspNetCore.Routing; +global using global::Microsoft.Extensions.Configuration; +global using global::Microsoft.Extensions.DependencyInjection; +global using global::Microsoft.Extensions.Hosting; +global using global::Microsoft.Extensions.Logging; +global using global::System; +global using global::System.Collections.Generic; +global using global::System.IO; +global using global::System.Linq; +global using global::System.Net.Http; +global using global::System.Net.Http.Json; +global using global::System.Threading; +global using global::System.Threading.Tasks; diff --git a/Server/obj/Debug/net8.0/OE.TenTrees.Server.assets.cache b/Server/obj/Debug/net8.0/OE.TenTrees.Server.assets.cache new file mode 100644 index 0000000..c00d314 Binary files /dev/null and b/Server/obj/Debug/net8.0/OE.TenTrees.Server.assets.cache differ diff --git a/Server/obj/Debug/net8.0/OE.TenTrees.Server.csproj.FileListAbsolute.txt b/Server/obj/Debug/net8.0/OE.TenTrees.Server.csproj.FileListAbsolute.txt new file mode 100644 index 0000000..e69de29 diff --git a/Server/obj/OE.TenTrees.Server.csproj.nuget.dgspec.json b/Server/obj/OE.TenTrees.Server.csproj.nuget.dgspec.json new file mode 100644 index 0000000..626587f --- /dev/null +++ b/Server/obj/OE.TenTrees.Server.csproj.nuget.dgspec.json @@ -0,0 +1,222 @@ +{ + "format": 1, + "restore": { + "/home/runner/work/TenTrees/TenTrees/Server/OE.TenTrees.Server.csproj": {} + }, + "projects": { + "/home/runner/work/TenTrees/TenTrees/Client/OE.TenTrees.Client.csproj": { + "version": "1.0.0", + "restore": { + "projectUniqueName": "/home/runner/work/TenTrees/TenTrees/Client/OE.TenTrees.Client.csproj", + "projectName": "OE.TenTrees.Client.Oqtane", + "projectPath": "/home/runner/work/TenTrees/TenTrees/Client/OE.TenTrees.Client.csproj", + "packagesPath": "/home/runner/.nuget/packages/", + "outputPath": "/home/runner/work/TenTrees/TenTrees/Client/obj/", + "projectStyle": "PackageReference", + "configFilePaths": [ + "/home/runner/.nuget/NuGet/NuGet.Config" + ], + "originalTargetFrameworks": [ + "net8.0" + ], + "sources": { + "https://api.nuget.org/v3/index.json": {} + }, + "frameworks": { + "net8.0": { + "targetAlias": "net8.0", + "projectReferences": { + "/home/runner/work/TenTrees/TenTrees/Shared/OE.TenTrees.Shared.csproj": { + "projectPath": "/home/runner/work/TenTrees/TenTrees/Shared/OE.TenTrees.Shared.csproj" + } + } + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + } + }, + "frameworks": { + "net8.0": { + "targetAlias": "net8.0", + "dependencies": { + "Microsoft.NET.ILLink.Tasks": { + "suppressParent": "All", + "target": "Package", + "version": "[8.0.19, )", + "autoReferenced": true + }, + "Microsoft.NET.Sdk.WebAssembly.Pack": { + "suppressParent": "All", + "target": "Package", + "version": "[8.0.19, )", + "autoReferenced": true + }, + "Oqtane.Client": { + "target": "Package", + "version": "[5.2.4, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48", + "net481" + ], + "assetTargetFallback": true, + "warn": true, + "downloadDependencies": [ + { + "name": "Microsoft.NETCore.App.Runtime.Mono.browser-wasm", + "version": "[8.0.19, 8.0.19]" + } + ], + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + } + }, + "runtimeIdentifierGraphPath": "/usr/lib/dotnet/sdk/8.0.119/PortableRuntimeIdentifierGraph.json" + } + }, + "runtimes": { + "browser-wasm": { + "#import": [] + } + } + }, + "/home/runner/work/TenTrees/TenTrees/Server/OE.TenTrees.Server.csproj": { + "version": "1.0.0", + "restore": { + "projectUniqueName": "/home/runner/work/TenTrees/TenTrees/Server/OE.TenTrees.Server.csproj", + "projectName": "OE.TenTrees.Server.Oqtane", + "projectPath": "/home/runner/work/TenTrees/TenTrees/Server/OE.TenTrees.Server.csproj", + "packagesPath": "/home/runner/.nuget/packages/", + "outputPath": "/home/runner/work/TenTrees/TenTrees/Server/obj/", + "projectStyle": "PackageReference", + "configFilePaths": [ + "/home/runner/.nuget/NuGet/NuGet.Config" + ], + "originalTargetFrameworks": [ + "net8.0" + ], + "sources": { + "https://api.nuget.org/v3/index.json": {} + }, + "frameworks": { + "net8.0": { + "targetAlias": "net8.0", + "projectReferences": { + "/home/runner/work/TenTrees/TenTrees/Client/OE.TenTrees.Client.csproj": { + "projectPath": "/home/runner/work/TenTrees/TenTrees/Client/OE.TenTrees.Client.csproj" + }, + "/home/runner/work/TenTrees/TenTrees/Shared/OE.TenTrees.Shared.csproj": { + "projectPath": "/home/runner/work/TenTrees/TenTrees/Shared/OE.TenTrees.Shared.csproj" + } + } + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + } + }, + "frameworks": { + "net8.0": { + "targetAlias": "net8.0", + "dependencies": { + "Oqtane.Server": { + "target": "Package", + "version": "[5.2.4, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48", + "net481" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "Microsoft.AspNetCore.App": { + "privateAssets": "none" + }, + "Microsoft.NETCore.App": { + "privateAssets": "all" + } + }, + "runtimeIdentifierGraphPath": "/usr/lib/dotnet/sdk/8.0.119/PortableRuntimeIdentifierGraph.json" + } + } + }, + "/home/runner/work/TenTrees/TenTrees/Shared/OE.TenTrees.Shared.csproj": { + "version": "1.0.0", + "restore": { + "projectUniqueName": "/home/runner/work/TenTrees/TenTrees/Shared/OE.TenTrees.Shared.csproj", + "projectName": "OE.TenTrees.Shared.Oqtane", + "projectPath": "/home/runner/work/TenTrees/TenTrees/Shared/OE.TenTrees.Shared.csproj", + "packagesPath": "/home/runner/.nuget/packages/", + "outputPath": "/home/runner/work/TenTrees/TenTrees/Shared/obj/", + "projectStyle": "PackageReference", + "configFilePaths": [ + "/home/runner/.nuget/NuGet/NuGet.Config" + ], + "originalTargetFrameworks": [ + "net8.0" + ], + "sources": { + "https://api.nuget.org/v3/index.json": {} + }, + "frameworks": { + "net8.0": { + "targetAlias": "net8.0", + "projectReferences": {} + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + } + }, + "frameworks": { + "net8.0": { + "targetAlias": "net8.0", + "dependencies": { + "Oqtane.Shared": { + "target": "Package", + "version": "[5.2.4, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48", + "net481" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + } + }, + "runtimeIdentifierGraphPath": "/usr/lib/dotnet/sdk/8.0.119/PortableRuntimeIdentifierGraph.json" + } + } + } + } +} \ No newline at end of file diff --git a/Server/obj/OE.TenTrees.Server.csproj.nuget.g.props b/Server/obj/OE.TenTrees.Server.csproj.nuget.g.props new file mode 100644 index 0000000..cf7e7b6 --- /dev/null +++ b/Server/obj/OE.TenTrees.Server.csproj.nuget.g.props @@ -0,0 +1,15 @@ + + + + True + NuGet + $(MSBuildThisFileDirectory)project.assets.json + /home/runner/.nuget/packages/ + /home/runner/.nuget/packages/ + PackageReference + 6.8.1 + + + + + \ No newline at end of file diff --git a/Server/obj/OE.TenTrees.Server.csproj.nuget.g.targets b/Server/obj/OE.TenTrees.Server.csproj.nuget.g.targets new file mode 100644 index 0000000..3dc06ef --- /dev/null +++ b/Server/obj/OE.TenTrees.Server.csproj.nuget.g.targets @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Server/obj/project.assets.json b/Server/obj/project.assets.json new file mode 100644 index 0000000..98f1e90 --- /dev/null +++ b/Server/obj/project.assets.json @@ -0,0 +1,241 @@ +{ + "version": 3, + "targets": { + "net8.0": { + "Oqtane.Client/5.2.4": { + "type": "package", + "compile": { + "lib/net8.0/Oqtane.Client.dll": { + "related": ".pdb" + } + }, + "runtime": { + "lib/net8.0/Oqtane.Client.dll": { + "related": ".pdb" + } + } + }, + "Oqtane.Server/5.2.4": { + "type": "package", + "compile": { + "lib/net8.0/Oqtane.Server.dll": { + "related": ".pdb" + } + }, + "runtime": { + "lib/net8.0/Oqtane.Server.dll": { + "related": ".pdb" + } + } + }, + "Oqtane.Shared/5.2.4": { + "type": "package", + "compile": { + "lib/net8.0/Oqtane.Shared.dll": { + "related": ".pdb" + } + }, + "runtime": { + "lib/net8.0/Oqtane.Shared.dll": { + "related": ".pdb" + } + } + }, + "OE.TenTrees.Client.Oqtane/1.0.0": { + "type": "project", + "framework": ".NETCoreApp,Version=v8.0", + "dependencies": { + "OE.TenTrees.Shared.Oqtane": "1.0.0", + "Oqtane.Client": "5.2.4" + }, + "compile": { + "bin/placeholder/OE.TenTrees.Client.Oqtane.dll": {} + }, + "runtime": { + "bin/placeholder/OE.TenTrees.Client.Oqtane.dll": {} + } + }, + "OE.TenTrees.Shared.Oqtane/1.0.0": { + "type": "project", + "framework": ".NETCoreApp,Version=v8.0", + "dependencies": { + "Oqtane.Shared": "5.2.4" + }, + "compile": { + "bin/placeholder/OE.TenTrees.Shared.Oqtane.dll": {} + }, + "runtime": { + "bin/placeholder/OE.TenTrees.Shared.Oqtane.dll": {} + } + } + } + }, + "libraries": { + "Oqtane.Client/5.2.4": { + "sha512": "5McfrfhrXJZ7ReG8XSz0YEBTNqb7awX8CpIixqrXFkfHZdEcaHVcborx7LY1epUXP7BUUYcR4zsVLR0s7mu+Dw==", + "type": "package", + "path": "oqtane.client/5.2.4", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "icon.png", + "lib/net8.0/Oqtane.Client.dll", + "lib/net8.0/Oqtane.Client.pdb", + "oqtane.client.5.2.4.nupkg.sha512", + "oqtane.client.nuspec", + "readme.md" + ] + }, + "Oqtane.Server/5.2.4": { + "sha512": "fu0j+vmgnQRnwl4LdTG0It6Iv5/plIeZuPGMHZyZCjmgJ+caoGC7R+147soUpqIzIjXe2qTxlLhEzUFjRdUOxA==", + "type": "package", + "path": "oqtane.server/5.2.4", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "icon.png", + "lib/net8.0/Oqtane.Server.dll", + "lib/net8.0/Oqtane.Server.pdb", + "oqtane.server.5.2.4.nupkg.sha512", + "oqtane.server.nuspec", + "readme.md" + ] + }, + "Oqtane.Shared/5.2.4": { + "sha512": "lczEoyrGnVvTTeIoH/8EMb4CSbIqPhkT4SLQ/0uwCwgtgdBYp46fyJ4vColzcO4Yb2VY4YsWnmNkVYDV7oOXGg==", + "type": "package", + "path": "oqtane.shared/5.2.4", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "icon.png", + "lib/net8.0/Oqtane.Shared.dll", + "lib/net8.0/Oqtane.Shared.pdb", + "oqtane.shared.5.2.4.nupkg.sha512", + "oqtane.shared.nuspec", + "readme.md" + ] + }, + "OE.TenTrees.Client.Oqtane/1.0.0": { + "type": "project", + "path": "../Client/OE.TenTrees.Client.csproj", + "msbuildProject": "../Client/OE.TenTrees.Client.csproj" + }, + "OE.TenTrees.Shared.Oqtane/1.0.0": { + "type": "project", + "path": "../Shared/OE.TenTrees.Shared.csproj", + "msbuildProject": "../Shared/OE.TenTrees.Shared.csproj" + } + }, + "projectFileDependencyGroups": { + "net8.0": [ + "OE.TenTrees.Client.Oqtane >= 1.0.0", + "OE.TenTrees.Shared.Oqtane >= 1.0.0", + "Oqtane.Server >= 5.2.4" + ] + }, + "packageFolders": { + "/home/runner/.nuget/packages/": {} + }, + "project": { + "version": "1.0.0", + "restore": { + "projectUniqueName": "/home/runner/work/TenTrees/TenTrees/Server/OE.TenTrees.Server.csproj", + "projectName": "OE.TenTrees.Server.Oqtane", + "projectPath": "/home/runner/work/TenTrees/TenTrees/Server/OE.TenTrees.Server.csproj", + "packagesPath": "/home/runner/.nuget/packages/", + "outputPath": "/home/runner/work/TenTrees/TenTrees/Server/obj/", + "projectStyle": "PackageReference", + "configFilePaths": [ + "/home/runner/.nuget/NuGet/NuGet.Config" + ], + "originalTargetFrameworks": [ + "net8.0" + ], + "sources": { + "https://api.nuget.org/v3/index.json": {} + }, + "frameworks": { + "net8.0": { + "targetAlias": "net8.0", + "projectReferences": { + "/home/runner/work/TenTrees/TenTrees/Client/OE.TenTrees.Client.csproj": { + "projectPath": "/home/runner/work/TenTrees/TenTrees/Client/OE.TenTrees.Client.csproj" + }, + "/home/runner/work/TenTrees/TenTrees/Shared/OE.TenTrees.Shared.csproj": { + "projectPath": "/home/runner/work/TenTrees/TenTrees/Shared/OE.TenTrees.Shared.csproj" + } + } + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + } + }, + "frameworks": { + "net8.0": { + "targetAlias": "net8.0", + "dependencies": { + "Oqtane.Server": { + "target": "Package", + "version": "[5.2.4, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48", + "net481" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "Microsoft.AspNetCore.App": { + "privateAssets": "none" + }, + "Microsoft.NETCore.App": { + "privateAssets": "all" + } + }, + "runtimeIdentifierGraphPath": "/usr/lib/dotnet/sdk/8.0.119/PortableRuntimeIdentifierGraph.json" + } + } + }, + "logs": [ + { + "code": "NU1901", + "level": "Warning", + "warningLevel": 1, + "message": "Package 'Oqtane.Server' 5.2.4 has a known low severity vulnerability, https://github.com/advisories/GHSA-2hr5-cvwp-jr5w", + "libraryId": "Oqtane.Server", + "targetGraphs": [ + "net8.0" + ] + }, + { + "code": "NU1903", + "level": "Warning", + "warningLevel": 1, + "message": "Package 'Oqtane.Server' 5.2.4 has a known high severity vulnerability, https://github.com/advisories/GHSA-995c-qww8-64fj", + "libraryId": "Oqtane.Server", + "targetGraphs": [ + "net8.0" + ] + }, + { + "code": "NU1902", + "level": "Warning", + "warningLevel": 1, + "message": "Package 'Oqtane.Server' 5.2.4 has a known moderate severity vulnerability, https://github.com/advisories/GHSA-hhcw-wwxv-g95c", + "libraryId": "Oqtane.Server", + "targetGraphs": [ + "net8.0" + ] + } + ] +} \ No newline at end of file diff --git a/Server/obj/project.nuget.cache b/Server/obj/project.nuget.cache new file mode 100644 index 0000000..7d78184 --- /dev/null +++ b/Server/obj/project.nuget.cache @@ -0,0 +1,43 @@ +{ + "version": 2, + "dgSpecHash": "9o05GEPSkfkxbRo/zwSvMpbYGJ9UxXX21BMBWjG3nGqDdLu6vy0AJj/od4+AiIZSKN2pnCFnuQ/H8XH6OZ+oNg==", + "success": true, + "projectFilePath": "/home/runner/work/TenTrees/TenTrees/Server/OE.TenTrees.Server.csproj", + "expectedPackageFiles": [ + "/home/runner/.nuget/packages/oqtane.client/5.2.4/oqtane.client.5.2.4.nupkg.sha512", + "/home/runner/.nuget/packages/oqtane.server/5.2.4/oqtane.server.5.2.4.nupkg.sha512", + "/home/runner/.nuget/packages/oqtane.shared/5.2.4/oqtane.shared.5.2.4.nupkg.sha512" + ], + "logs": [ + { + "code": "NU1901", + "level": "Warning", + "warningLevel": 1, + "message": "Package 'Oqtane.Server' 5.2.4 has a known low severity vulnerability, https://github.com/advisories/GHSA-2hr5-cvwp-jr5w", + "libraryId": "Oqtane.Server", + "targetGraphs": [ + "net8.0" + ] + }, + { + "code": "NU1903", + "level": "Warning", + "warningLevel": 1, + "message": "Package 'Oqtane.Server' 5.2.4 has a known high severity vulnerability, https://github.com/advisories/GHSA-995c-qww8-64fj", + "libraryId": "Oqtane.Server", + "targetGraphs": [ + "net8.0" + ] + }, + { + "code": "NU1902", + "level": "Warning", + "warningLevel": 1, + "message": "Package 'Oqtane.Server' 5.2.4 has a known moderate severity vulnerability, https://github.com/advisories/GHSA-hhcw-wwxv-g95c", + "libraryId": "Oqtane.Server", + "targetGraphs": [ + "net8.0" + ] + } + ] +} \ No newline at end of file diff --git a/Shared/Models/PlantingEvent.cs b/Shared/Models/PlantingEvent.cs new file mode 100644 index 0000000..80c2ca8 --- /dev/null +++ b/Shared/Models/PlantingEvent.cs @@ -0,0 +1,52 @@ +using System; +using System.ComponentModel.DataAnnotations; +using Oqtane.Models; + +namespace OE.TenTrees.Models +{ + public class PlantingEvent : IAuditable + { + [Key] + public int PlantingEventId { get; set; } + + public int ModuleId { get; set; } + + [Required] + [StringLength(100)] + public string EventName { get; set; } = string.Empty; + + [Required] + public DateTime PlantingDate { get; set; } + + [Required] + public double Latitude { get; set; } + + [Required] + public double Longitude { get; set; } + + [StringLength(200)] + public string? Location { get; set; } + + [Required] + public int TreesPlanted { get; set; } + + [StringLength(500)] + public string? Description { get; set; } + + [StringLength(100)] + public string? Organizer { get; set; } + + [StringLength(100)] + public string? Sponsor { get; set; } + + public int? ParticipantCount { get; set; } + + [StringLength(1000)] + public string? Notes { get; set; } + + public string CreatedBy { get; set; } = string.Empty; + public DateTime CreatedOn { get; set; } + public string ModifiedBy { get; set; } = string.Empty; + public DateTime ModifiedOn { get; set; } + } +} \ No newline at end of file diff --git a/Shared/Models/Tree.cs b/Shared/Models/Tree.cs new file mode 100644 index 0000000..d16451d --- /dev/null +++ b/Shared/Models/Tree.cs @@ -0,0 +1,50 @@ +using System; +using System.ComponentModel.DataAnnotations; +using Oqtane.Models; + +namespace OE.TenTrees.Models +{ + public class Tree : IAuditable + { + [Key] + public int TreeId { get; set; } + + public int ModuleId { get; set; } + + [Required] + [StringLength(100)] + public string Species { get; set; } = string.Empty; + + [StringLength(100)] + public string CommonName { get; set; } = string.Empty; + + [Required] + public double Latitude { get; set; } + + [Required] + public double Longitude { get; set; } + + [StringLength(200)] + public string? Location { get; set; } + + public DateTime PlantedDate { get; set; } + + [StringLength(50)] + public string Status { get; set; } = "Healthy"; + + [StringLength(500)] + public string? Notes { get; set; } + + public double? Height { get; set; } + + public double? Diameter { get; set; } + + [StringLength(100)] + public string? PlantedBy { get; set; } + + public string CreatedBy { get; set; } = string.Empty; + public DateTime CreatedOn { get; set; } + public string ModifiedBy { get; set; } = string.Empty; + public DateTime ModifiedOn { get; set; } + } +} \ No newline at end of file diff --git a/Shared/Models/TreeMonitoring.cs b/Shared/Models/TreeMonitoring.cs new file mode 100644 index 0000000..4eb133e --- /dev/null +++ b/Shared/Models/TreeMonitoring.cs @@ -0,0 +1,49 @@ +using System; +using System.ComponentModel.DataAnnotations; +using Oqtane.Models; + +namespace OE.TenTrees.Models +{ + public class TreeMonitoring : IAuditable + { + [Key] + public int TreeMonitoringId { get; set; } + + public int ModuleId { get; set; } + + [Required] + public int TreeId { get; set; } + + public Tree? Tree { get; set; } + + [Required] + public DateTime MonitoringDate { get; set; } + + [Required] + [StringLength(50)] + public string HealthStatus { get; set; } = "Healthy"; + + public double? Height { get; set; } + + public double? Diameter { get; set; } + + [StringLength(500)] + public string? Observations { get; set; } + + [StringLength(100)] + public string? MonitoredBy { get; set; } + + [StringLength(200)] + public string? PhotoUrl { get; set; } + + public bool RequiresAttention { get; set; } = false; + + [StringLength(300)] + public string? RecommendedActions { get; set; } + + public string CreatedBy { get; set; } = string.Empty; + public DateTime CreatedOn { get; set; } + public string ModifiedBy { get; set; } = string.Empty; + public DateTime ModifiedOn { get; set; } + } +} \ No newline at end of file diff --git a/Shared/OE.TenTrees.Shared.csproj b/Shared/OE.TenTrees.Shared.csproj new file mode 100644 index 0000000..2249b54 --- /dev/null +++ b/Shared/OE.TenTrees.Shared.csproj @@ -0,0 +1,14 @@ + + + + net8.0 + 1.0.0 + OE.TenTrees.Shared.Oqtane + enable + + + + + + + \ No newline at end of file diff --git a/Shared/bin/Debug/net8.0/OE.TenTrees.Shared.Oqtane.deps.json b/Shared/bin/Debug/net8.0/OE.TenTrees.Shared.Oqtane.deps.json new file mode 100644 index 0000000..86680ee --- /dev/null +++ b/Shared/bin/Debug/net8.0/OE.TenTrees.Shared.Oqtane.deps.json @@ -0,0 +1,41 @@ +{ + "runtimeTarget": { + "name": ".NETCoreApp,Version=v8.0", + "signature": "" + }, + "compilationOptions": {}, + "targets": { + ".NETCoreApp,Version=v8.0": { + "OE.TenTrees.Shared.Oqtane/1.0.0": { + "dependencies": { + "Oqtane.Shared": "5.2.4" + }, + "runtime": { + "OE.TenTrees.Shared.Oqtane.dll": {} + } + }, + "Oqtane.Shared/5.2.4": { + "runtime": { + "lib/net8.0/Oqtane.Shared.dll": { + "assemblyVersion": "5.2.4.0", + "fileVersion": "5.2.4.0" + } + } + } + } + }, + "libraries": { + "OE.TenTrees.Shared.Oqtane/1.0.0": { + "type": "project", + "serviceable": false, + "sha512": "" + }, + "Oqtane.Shared/5.2.4": { + "type": "package", + "serviceable": true, + "sha512": "sha512-lczEoyrGnVvTTeIoH/8EMb4CSbIqPhkT4SLQ/0uwCwgtgdBYp46fyJ4vColzcO4Yb2VY4YsWnmNkVYDV7oOXGg==", + "path": "oqtane.shared/5.2.4", + "hashPath": "oqtane.shared.5.2.4.nupkg.sha512" + } + } +} \ No newline at end of file diff --git a/Shared/bin/Debug/net8.0/OE.TenTrees.Shared.Oqtane.dll b/Shared/bin/Debug/net8.0/OE.TenTrees.Shared.Oqtane.dll new file mode 100644 index 0000000..7c84097 Binary files /dev/null and b/Shared/bin/Debug/net8.0/OE.TenTrees.Shared.Oqtane.dll differ diff --git a/Shared/bin/Debug/net8.0/OE.TenTrees.Shared.Oqtane.pdb b/Shared/bin/Debug/net8.0/OE.TenTrees.Shared.Oqtane.pdb new file mode 100644 index 0000000..48d5170 Binary files /dev/null and b/Shared/bin/Debug/net8.0/OE.TenTrees.Shared.Oqtane.pdb differ diff --git a/Shared/obj/Debug/net8.0/.NETCoreApp,Version=v8.0.AssemblyAttributes.cs b/Shared/obj/Debug/net8.0/.NETCoreApp,Version=v8.0.AssemblyAttributes.cs new file mode 100644 index 0000000..2217181 --- /dev/null +++ b/Shared/obj/Debug/net8.0/.NETCoreApp,Version=v8.0.AssemblyAttributes.cs @@ -0,0 +1,4 @@ +// +using System; +using System.Reflection; +[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v8.0", FrameworkDisplayName = ".NET 8.0")] diff --git a/Shared/obj/Debug/net8.0/OE.TenTrees.Shared.AssemblyInfo.cs b/Shared/obj/Debug/net8.0/OE.TenTrees.Shared.AssemblyInfo.cs new file mode 100644 index 0000000..77f686d --- /dev/null +++ b/Shared/obj/Debug/net8.0/OE.TenTrees.Shared.AssemblyInfo.cs @@ -0,0 +1,22 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Reflection.AssemblyCompanyAttribute("OE.TenTrees.Shared.Oqtane")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+d4cd3fc9c5c09a1849179819dbe99d6700234433")] +[assembly: System.Reflection.AssemblyProductAttribute("OE.TenTrees.Shared.Oqtane")] +[assembly: System.Reflection.AssemblyTitleAttribute("OE.TenTrees.Shared.Oqtane")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] + +// Generated by the MSBuild WriteCodeFragment class. + diff --git a/Shared/obj/Debug/net8.0/OE.TenTrees.Shared.AssemblyInfoInputs.cache b/Shared/obj/Debug/net8.0/OE.TenTrees.Shared.AssemblyInfoInputs.cache new file mode 100644 index 0000000..0f0b79c --- /dev/null +++ b/Shared/obj/Debug/net8.0/OE.TenTrees.Shared.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +1d8f1fccb96405510b4586ce0865c5d75ba201df1ec6e30e00f07660dc209378 diff --git a/Shared/obj/Debug/net8.0/OE.TenTrees.Shared.GeneratedMSBuildEditorConfig.editorconfig b/Shared/obj/Debug/net8.0/OE.TenTrees.Shared.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..a53d349 --- /dev/null +++ b/Shared/obj/Debug/net8.0/OE.TenTrees.Shared.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,13 @@ +is_global = true +build_property.TargetFramework = net8.0 +build_property.TargetPlatformMinVersion = +build_property.UsingMicrosoftNETSdkWeb = +build_property.ProjectTypeGuids = +build_property.InvariantGlobalization = +build_property.PlatformNeutralAssembly = +build_property.EnforceExtendedAnalyzerRules = +build_property._SupportedPlatformList = Linux,macOS,Windows +build_property.RootNamespace = OE.TenTrees.Shared +build_property.ProjectDir = /home/runner/work/TenTrees/TenTrees/Shared/ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = diff --git a/Shared/obj/Debug/net8.0/OE.TenTrees.Shared.Oqtane.dll b/Shared/obj/Debug/net8.0/OE.TenTrees.Shared.Oqtane.dll new file mode 100644 index 0000000..7c84097 Binary files /dev/null and b/Shared/obj/Debug/net8.0/OE.TenTrees.Shared.Oqtane.dll differ diff --git a/Shared/obj/Debug/net8.0/OE.TenTrees.Shared.Oqtane.pdb b/Shared/obj/Debug/net8.0/OE.TenTrees.Shared.Oqtane.pdb new file mode 100644 index 0000000..48d5170 Binary files /dev/null and b/Shared/obj/Debug/net8.0/OE.TenTrees.Shared.Oqtane.pdb differ diff --git a/Shared/obj/Debug/net8.0/OE.TenTrees.Shared.assets.cache b/Shared/obj/Debug/net8.0/OE.TenTrees.Shared.assets.cache new file mode 100644 index 0000000..3fe9bde Binary files /dev/null and b/Shared/obj/Debug/net8.0/OE.TenTrees.Shared.assets.cache differ diff --git a/Shared/obj/Debug/net8.0/OE.TenTrees.Shared.csproj.AssemblyReference.cache b/Shared/obj/Debug/net8.0/OE.TenTrees.Shared.csproj.AssemblyReference.cache new file mode 100644 index 0000000..b22a048 Binary files /dev/null and b/Shared/obj/Debug/net8.0/OE.TenTrees.Shared.csproj.AssemblyReference.cache differ diff --git a/Shared/obj/Debug/net8.0/OE.TenTrees.Shared.csproj.CoreCompileInputs.cache b/Shared/obj/Debug/net8.0/OE.TenTrees.Shared.csproj.CoreCompileInputs.cache new file mode 100644 index 0000000..387fa75 --- /dev/null +++ b/Shared/obj/Debug/net8.0/OE.TenTrees.Shared.csproj.CoreCompileInputs.cache @@ -0,0 +1 @@ +aa3aa6dcf757e03ae1e181dd8ad324a7e528487981401d4679789126304d6a22 diff --git a/Shared/obj/Debug/net8.0/OE.TenTrees.Shared.csproj.FileListAbsolute.txt b/Shared/obj/Debug/net8.0/OE.TenTrees.Shared.csproj.FileListAbsolute.txt new file mode 100644 index 0000000..096e3cc --- /dev/null +++ b/Shared/obj/Debug/net8.0/OE.TenTrees.Shared.csproj.FileListAbsolute.txt @@ -0,0 +1,13 @@ +/home/runner/work/TenTrees/TenTrees/Shared/bin/Debug/net8.0/OE.TenTrees.Shared.Oqtane.deps.json +/home/runner/work/TenTrees/TenTrees/Shared/bin/Debug/net8.0/OE.TenTrees.Shared.Oqtane.dll +/home/runner/work/TenTrees/TenTrees/Shared/bin/Debug/net8.0/OE.TenTrees.Shared.Oqtane.pdb +/home/runner/work/TenTrees/TenTrees/Shared/obj/Debug/net8.0/OE.TenTrees.Shared.csproj.AssemblyReference.cache +/home/runner/work/TenTrees/TenTrees/Shared/obj/Debug/net8.0/OE.TenTrees.Shared.GeneratedMSBuildEditorConfig.editorconfig +/home/runner/work/TenTrees/TenTrees/Shared/obj/Debug/net8.0/OE.TenTrees.Shared.AssemblyInfoInputs.cache +/home/runner/work/TenTrees/TenTrees/Shared/obj/Debug/net8.0/OE.TenTrees.Shared.AssemblyInfo.cs +/home/runner/work/TenTrees/TenTrees/Shared/obj/Debug/net8.0/OE.TenTrees.Shared.csproj.CoreCompileInputs.cache +/home/runner/work/TenTrees/TenTrees/Shared/obj/Debug/net8.0/OE.TenTrees.Shared.sourcelink.json +/home/runner/work/TenTrees/TenTrees/Shared/obj/Debug/net8.0/OE.TenTrees.Shared.Oqtane.dll +/home/runner/work/TenTrees/TenTrees/Shared/obj/Debug/net8.0/refint/OE.TenTrees.Shared.Oqtane.dll +/home/runner/work/TenTrees/TenTrees/Shared/obj/Debug/net8.0/OE.TenTrees.Shared.Oqtane.pdb +/home/runner/work/TenTrees/TenTrees/Shared/obj/Debug/net8.0/ref/OE.TenTrees.Shared.Oqtane.dll diff --git a/Shared/obj/Debug/net8.0/OE.TenTrees.Shared.sourcelink.json b/Shared/obj/Debug/net8.0/OE.TenTrees.Shared.sourcelink.json new file mode 100644 index 0000000..952e2ce --- /dev/null +++ b/Shared/obj/Debug/net8.0/OE.TenTrees.Shared.sourcelink.json @@ -0,0 +1 @@ +{"documents":{"/home/runner/work/TenTrees/TenTrees/*":"https://raw.githubusercontent.com/OpenEugene/TenTrees/d4cd3fc9c5c09a1849179819dbe99d6700234433/*"}} \ No newline at end of file diff --git a/Shared/obj/Debug/net8.0/ref/OE.TenTrees.Shared.Oqtane.dll b/Shared/obj/Debug/net8.0/ref/OE.TenTrees.Shared.Oqtane.dll new file mode 100644 index 0000000..c1504b2 Binary files /dev/null and b/Shared/obj/Debug/net8.0/ref/OE.TenTrees.Shared.Oqtane.dll differ diff --git a/Shared/obj/Debug/net8.0/refint/OE.TenTrees.Shared.Oqtane.dll b/Shared/obj/Debug/net8.0/refint/OE.TenTrees.Shared.Oqtane.dll new file mode 100644 index 0000000..c1504b2 Binary files /dev/null and b/Shared/obj/Debug/net8.0/refint/OE.TenTrees.Shared.Oqtane.dll differ diff --git a/Shared/obj/OE.TenTrees.Shared.csproj.nuget.dgspec.json b/Shared/obj/OE.TenTrees.Shared.csproj.nuget.dgspec.json new file mode 100644 index 0000000..daae992 --- /dev/null +++ b/Shared/obj/OE.TenTrees.Shared.csproj.nuget.dgspec.json @@ -0,0 +1,67 @@ +{ + "format": 1, + "restore": { + "/home/runner/work/TenTrees/TenTrees/Shared/OE.TenTrees.Shared.csproj": {} + }, + "projects": { + "/home/runner/work/TenTrees/TenTrees/Shared/OE.TenTrees.Shared.csproj": { + "version": "1.0.0", + "restore": { + "projectUniqueName": "/home/runner/work/TenTrees/TenTrees/Shared/OE.TenTrees.Shared.csproj", + "projectName": "OE.TenTrees.Shared.Oqtane", + "projectPath": "/home/runner/work/TenTrees/TenTrees/Shared/OE.TenTrees.Shared.csproj", + "packagesPath": "/home/runner/.nuget/packages/", + "outputPath": "/home/runner/work/TenTrees/TenTrees/Shared/obj/", + "projectStyle": "PackageReference", + "configFilePaths": [ + "/home/runner/.nuget/NuGet/NuGet.Config" + ], + "originalTargetFrameworks": [ + "net8.0" + ], + "sources": { + "https://api.nuget.org/v3/index.json": {} + }, + "frameworks": { + "net8.0": { + "targetAlias": "net8.0", + "projectReferences": {} + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + } + }, + "frameworks": { + "net8.0": { + "targetAlias": "net8.0", + "dependencies": { + "Oqtane.Shared": { + "target": "Package", + "version": "[5.2.4, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48", + "net481" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + } + }, + "runtimeIdentifierGraphPath": "/usr/lib/dotnet/sdk/8.0.119/PortableRuntimeIdentifierGraph.json" + } + } + } + } +} \ No newline at end of file diff --git a/Shared/obj/OE.TenTrees.Shared.csproj.nuget.g.props b/Shared/obj/OE.TenTrees.Shared.csproj.nuget.g.props new file mode 100644 index 0000000..cf7e7b6 --- /dev/null +++ b/Shared/obj/OE.TenTrees.Shared.csproj.nuget.g.props @@ -0,0 +1,15 @@ + + + + True + NuGet + $(MSBuildThisFileDirectory)project.assets.json + /home/runner/.nuget/packages/ + /home/runner/.nuget/packages/ + PackageReference + 6.8.1 + + + + + \ No newline at end of file diff --git a/Shared/obj/OE.TenTrees.Shared.csproj.nuget.g.targets b/Shared/obj/OE.TenTrees.Shared.csproj.nuget.g.targets new file mode 100644 index 0000000..3dc06ef --- /dev/null +++ b/Shared/obj/OE.TenTrees.Shared.csproj.nuget.g.targets @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/Shared/obj/project.assets.json b/Shared/obj/project.assets.json new file mode 100644 index 0000000..5ef35e6 --- /dev/null +++ b/Shared/obj/project.assets.json @@ -0,0 +1,116 @@ +{ + "version": 3, + "targets": { + "net8.0": { + "Oqtane.Shared/5.2.4": { + "type": "package", + "compile": { + "lib/net8.0/Oqtane.Shared.dll": { + "related": ".pdb" + } + }, + "runtime": { + "lib/net8.0/Oqtane.Shared.dll": { + "related": ".pdb" + } + } + } + } + }, + "libraries": { + "Oqtane.Shared/5.2.4": { + "sha512": "lczEoyrGnVvTTeIoH/8EMb4CSbIqPhkT4SLQ/0uwCwgtgdBYp46fyJ4vColzcO4Yb2VY4YsWnmNkVYDV7oOXGg==", + "type": "package", + "path": "oqtane.shared/5.2.4", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "icon.png", + "lib/net8.0/Oqtane.Shared.dll", + "lib/net8.0/Oqtane.Shared.pdb", + "oqtane.shared.5.2.4.nupkg.sha512", + "oqtane.shared.nuspec", + "readme.md" + ] + } + }, + "projectFileDependencyGroups": { + "net8.0": [ + "Oqtane.Shared >= 5.2.4" + ] + }, + "packageFolders": { + "/home/runner/.nuget/packages/": {} + }, + "project": { + "version": "1.0.0", + "restore": { + "projectUniqueName": "/home/runner/work/TenTrees/TenTrees/Shared/OE.TenTrees.Shared.csproj", + "projectName": "OE.TenTrees.Shared.Oqtane", + "projectPath": "/home/runner/work/TenTrees/TenTrees/Shared/OE.TenTrees.Shared.csproj", + "packagesPath": "/home/runner/.nuget/packages/", + "outputPath": "/home/runner/work/TenTrees/TenTrees/Shared/obj/", + "projectStyle": "PackageReference", + "configFilePaths": [ + "/home/runner/.nuget/NuGet/NuGet.Config" + ], + "originalTargetFrameworks": [ + "net8.0" + ], + "sources": { + "https://api.nuget.org/v3/index.json": {} + }, + "frameworks": { + "net8.0": { + "targetAlias": "net8.0", + "projectReferences": {} + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + } + }, + "frameworks": { + "net8.0": { + "targetAlias": "net8.0", + "dependencies": { + "Oqtane.Shared": { + "target": "Package", + "version": "[5.2.4, )" + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48", + "net481" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + } + }, + "runtimeIdentifierGraphPath": "/usr/lib/dotnet/sdk/8.0.119/PortableRuntimeIdentifierGraph.json" + } + } + }, + "logs": [ + { + "code": "NU1901", + "level": "Warning", + "warningLevel": 1, + "message": "Package 'Oqtane.Shared' 5.2.4 has a known low severity vulnerability, https://github.com/advisories/GHSA-2hr5-cvwp-jr5w", + "libraryId": "Oqtane.Shared", + "targetGraphs": [ + "net8.0" + ] + } + ] +} \ No newline at end of file diff --git a/Shared/obj/project.nuget.cache b/Shared/obj/project.nuget.cache new file mode 100644 index 0000000..6c2426e --- /dev/null +++ b/Shared/obj/project.nuget.cache @@ -0,0 +1,21 @@ +{ + "version": 2, + "dgSpecHash": "fQym9phPGt2qu7v60Lehqigd+VTaxk8JnI6KcF9oA4vJCWU52hQrm1+Exa9kWXRwR1byPmF/1jB9SxEcTUmQhQ==", + "success": true, + "projectFilePath": "/home/runner/work/TenTrees/TenTrees/Shared/OE.TenTrees.Shared.csproj", + "expectedPackageFiles": [ + "/home/runner/.nuget/packages/oqtane.shared/5.2.4/oqtane.shared.5.2.4.nupkg.sha512" + ], + "logs": [ + { + "code": "NU1901", + "level": "Warning", + "warningLevel": 1, + "message": "Package 'Oqtane.Shared' 5.2.4 has a known low severity vulnerability, https://github.com/advisories/GHSA-2hr5-cvwp-jr5w", + "libraryId": "Oqtane.Shared", + "targetGraphs": [ + "net8.0" + ] + } + ] +} \ No newline at end of file