diff --git a/.dockerignore b/.dockerignore
new file mode 100644
index 0000000..b334dfe
--- /dev/null
+++ b/.dockerignore
@@ -0,0 +1,5 @@
+# flyctl launch added from MarketPlaceApi/.gitignore
+MarketPlaceApi/.vscode
+MarketPlaceApi/**/.env
+MarketPlaceApi/**/exceptions.log
+MarketPlaceApi/**/fly.toml
diff --git a/.github/workflows/main_crowdlaunch-backend.yml b/.github/workflows/main_crowdlaunch-backend.yml
new file mode 100644
index 0000000..69fa503
--- /dev/null
+++ b/.github/workflows/main_crowdlaunch-backend.yml
@@ -0,0 +1,57 @@
+# Docs for the Azure Web Apps Deploy action: https://github.com/Azure/webapps-deploy
+# More GitHub Actions for Azure: https://github.com/Azure/actions
+
+name: Build and deploy ASP.Net Core app to Azure Web App - crowdlaunch-backend
+
+on:
+ push:
+ branches:
+ - main
+ workflow_dispatch:
+
+jobs:
+ build:
+ runs-on: windows-latest
+
+ steps:
+ - uses: actions/checkout@v2
+
+ - name: Set up .NET Core
+ uses: actions/setup-dotnet@v1
+ with:
+ dotnet-version: '3.1'
+ include-prerelease: true
+
+ - name: Build with dotnet
+ run: dotnet build --configuration Release
+
+ - name: dotnet publish
+ run: dotnet publish -c Release -o ${{env.DOTNET_ROOT}}/myapp
+
+ - name: Upload artifact for deployment job
+ uses: actions/upload-artifact@v2
+ with:
+ name: .net-app
+ path: ${{env.DOTNET_ROOT}}/myapp
+
+ deploy:
+ runs-on: windows-latest
+ needs: build
+ environment:
+ name: 'Production'
+ url: ${{ steps.deploy-to-webapp.outputs.webapp-url }}
+
+ steps:
+ - name: Download artifact from build job
+ uses: actions/download-artifact@v2
+ with:
+ name: .net-app
+
+ - name: Deploy to Azure Web App
+ id: deploy-to-webapp
+ uses: azure/webapps-deploy@v2
+ with:
+ app-name: 'crowdlaunch-backend'
+ slot-name: 'Production'
+ publish-profile: ${{ secrets.AZUREAPPSERVICE_PUBLISHPROFILE_6CB2E6F9FA9D4B4E80CF38E0FDD6272B }}
+ package: .
diff --git a/.vs/crowdlaunch-backend/xs/UserPrefs.xml b/.vs/crowdlaunch-backend/xs/UserPrefs.xml
deleted file mode 100644
index 38f3659..0000000
--- a/.vs/crowdlaunch-backend/xs/UserPrefs.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.vs/crowdlaunch-backend/xs/project-cache/crowdlaunch-backend-Debug.json b/.vs/crowdlaunch-backend/xs/project-cache/crowdlaunch-backend-Debug.json
deleted file mode 100644
index 247d600..0000000
--- a/.vs/crowdlaunch-backend/xs/project-cache/crowdlaunch-backend-Debug.json
+++ /dev/null
@@ -1 +0,0 @@
-{"Format":1,"ProjectReferences":[],"MetadataReferences":[{"FilePath":"/Users/user/.nuget/packages/awssdk.core/3.7.100.14/lib/netcoreapp3.1/AWSSDK.Core.dll","Aliases":[],"Framework":null},{"FilePath":"/Users/user/.nuget/packages/awssdk.securitytoken/3.7.100.14/lib/netcoreapp3.1/AWSSDK.SecurityToken.dll","Aliases":[],"Framework":null},{"FilePath":"/Users/user/.nuget/packages/dnsclient/1.6.1/lib/net5.0/DnsClient.dll","Aliases":[],"Framework":null},{"FilePath":"/Users/user/.nuget/packages/dotnetenv/2.5.0/lib/netstandard1.3/DotNetEnv.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/Microsoft.AspNetCore.Antiforgery.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/Microsoft.AspNetCore.Authentication.Abstractions.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/Microsoft.AspNetCore.Authentication.Cookies.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/Microsoft.AspNetCore.Authentication.Core.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/Microsoft.AspNetCore.Authentication.dll","Aliases":[],"Framework":null},{"FilePath":"/Users/user/.nuget/packages/microsoft.aspnetcore.authentication.jwtbearer/7.0.10/lib/net7.0/Microsoft.AspNetCore.Authentication.JwtBearer.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/Microsoft.AspNetCore.Authentication.OAuth.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/Microsoft.AspNetCore.Authorization.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/Microsoft.AspNetCore.Authorization.Policy.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/Microsoft.AspNetCore.Components.Authorization.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/Microsoft.AspNetCore.Components.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/Microsoft.AspNetCore.Components.Forms.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/Microsoft.AspNetCore.Components.Server.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/Microsoft.AspNetCore.Components.Web.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/Microsoft.AspNetCore.Connections.Abstractions.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/Microsoft.AspNetCore.CookiePolicy.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/Microsoft.AspNetCore.Cors.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/Microsoft.AspNetCore.Cryptography.Internal.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/Microsoft.AspNetCore.Cryptography.KeyDerivation.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/Microsoft.AspNetCore.DataProtection.Abstractions.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/Microsoft.AspNetCore.DataProtection.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/Microsoft.AspNetCore.DataProtection.Extensions.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/Microsoft.AspNetCore.Diagnostics.Abstractions.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/Microsoft.AspNetCore.Diagnostics.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/Microsoft.AspNetCore.Diagnostics.HealthChecks.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/Microsoft.AspNetCore.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/Microsoft.AspNetCore.HostFiltering.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/Microsoft.AspNetCore.Hosting.Abstractions.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/Microsoft.AspNetCore.Hosting.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/Microsoft.AspNetCore.Hosting.Server.Abstractions.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/Microsoft.AspNetCore.Html.Abstractions.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/Microsoft.AspNetCore.Http.Abstractions.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/Microsoft.AspNetCore.Http.Connections.Common.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/Microsoft.AspNetCore.Http.Connections.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/Microsoft.AspNetCore.Http.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/Microsoft.AspNetCore.Http.Extensions.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/Microsoft.AspNetCore.Http.Features.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/Microsoft.AspNetCore.Http.Results.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/Microsoft.AspNetCore.HttpLogging.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/Microsoft.AspNetCore.HttpOverrides.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/Microsoft.AspNetCore.HttpsPolicy.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/Microsoft.AspNetCore.Identity.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/Microsoft.AspNetCore.Localization.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/Microsoft.AspNetCore.Localization.Routing.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/Microsoft.AspNetCore.Metadata.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/Microsoft.AspNetCore.Mvc.Abstractions.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/Microsoft.AspNetCore.Mvc.ApiExplorer.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/Microsoft.AspNetCore.Mvc.Core.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/Microsoft.AspNetCore.Mvc.Cors.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/Microsoft.AspNetCore.Mvc.DataAnnotations.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/Microsoft.AspNetCore.Mvc.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/Microsoft.AspNetCore.Mvc.Formatters.Json.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/Microsoft.AspNetCore.Mvc.Formatters.Xml.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/Microsoft.AspNetCore.Mvc.Localization.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/Microsoft.AspNetCore.Mvc.Razor.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/Microsoft.AspNetCore.Mvc.RazorPages.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/Microsoft.AspNetCore.Mvc.TagHelpers.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/Microsoft.AspNetCore.Mvc.ViewFeatures.dll","Aliases":[],"Framework":null},{"FilePath":"/Users/user/.nuget/packages/microsoft.aspnetcore.openapi/7.0.10/lib/net7.0/Microsoft.AspNetCore.OpenApi.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/Microsoft.AspNetCore.OutputCaching.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/Microsoft.AspNetCore.RateLimiting.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/Microsoft.AspNetCore.Razor.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/Microsoft.AspNetCore.Razor.Runtime.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/Microsoft.AspNetCore.RequestDecompression.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/Microsoft.AspNetCore.ResponseCaching.Abstractions.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/Microsoft.AspNetCore.ResponseCaching.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/Microsoft.AspNetCore.ResponseCompression.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/Microsoft.AspNetCore.Rewrite.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/Microsoft.AspNetCore.Routing.Abstractions.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/Microsoft.AspNetCore.Routing.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/Microsoft.AspNetCore.Server.HttpSys.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/Microsoft.AspNetCore.Server.IIS.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/Microsoft.AspNetCore.Server.IISIntegration.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/Microsoft.AspNetCore.Server.Kestrel.Core.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/Microsoft.AspNetCore.Server.Kestrel.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/Microsoft.AspNetCore.Server.Kestrel.Transport.Quic.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/Microsoft.AspNetCore.Session.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/Microsoft.AspNetCore.SignalR.Common.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/Microsoft.AspNetCore.SignalR.Core.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/Microsoft.AspNetCore.SignalR.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/Microsoft.AspNetCore.SignalR.Protocols.Json.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/Microsoft.AspNetCore.StaticFiles.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/Microsoft.AspNetCore.WebSockets.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/Microsoft.AspNetCore.WebUtilities.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/Microsoft.CSharp.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/Microsoft.Extensions.Caching.Abstractions.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/Microsoft.Extensions.Caching.Memory.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/Microsoft.Extensions.Configuration.Abstractions.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/Microsoft.Extensions.Configuration.Binder.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/Microsoft.Extensions.Configuration.CommandLine.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/Microsoft.Extensions.Configuration.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/Microsoft.Extensions.Configuration.EnvironmentVariables.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/Microsoft.Extensions.Configuration.FileExtensions.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/Microsoft.Extensions.Configuration.Ini.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/Microsoft.Extensions.Configuration.Json.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/Microsoft.Extensions.Configuration.KeyPerFile.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/Microsoft.Extensions.Configuration.UserSecrets.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/Microsoft.Extensions.Configuration.Xml.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/Microsoft.Extensions.DependencyInjection.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/Microsoft.Extensions.Diagnostics.HealthChecks.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/Microsoft.Extensions.Features.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/Microsoft.Extensions.FileProviders.Abstractions.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/Microsoft.Extensions.FileProviders.Composite.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/Microsoft.Extensions.FileProviders.Embedded.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/Microsoft.Extensions.FileProviders.Physical.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/Microsoft.Extensions.FileSystemGlobbing.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/Microsoft.Extensions.Hosting.Abstractions.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/Microsoft.Extensions.Hosting.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/Microsoft.Extensions.Http.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/Microsoft.Extensions.Identity.Core.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/Microsoft.Extensions.Identity.Stores.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/Microsoft.Extensions.Localization.Abstractions.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/Microsoft.Extensions.Localization.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/Microsoft.Extensions.Logging.Abstractions.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/Microsoft.Extensions.Logging.Configuration.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/Microsoft.Extensions.Logging.Console.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/Microsoft.Extensions.Logging.Debug.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/Microsoft.Extensions.Logging.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/Microsoft.Extensions.Logging.EventLog.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/Microsoft.Extensions.Logging.EventSource.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/Microsoft.Extensions.Logging.TraceSource.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/Microsoft.Extensions.ObjectPool.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/Microsoft.Extensions.Options.ConfigurationExtensions.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/Microsoft.Extensions.Options.DataAnnotations.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/Microsoft.Extensions.Options.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/Microsoft.Extensions.Primitives.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/Microsoft.Extensions.WebEncoders.dll","Aliases":[],"Framework":null},{"FilePath":"/Users/user/.nuget/packages/microsoft.identitymodel.abstractions/6.32.1/lib/net6.0/Microsoft.IdentityModel.Abstractions.dll","Aliases":[],"Framework":null},{"FilePath":"/Users/user/.nuget/packages/microsoft.identitymodel.jsonwebtokens/6.32.1/lib/net6.0/Microsoft.IdentityModel.JsonWebTokens.dll","Aliases":[],"Framework":null},{"FilePath":"/Users/user/.nuget/packages/microsoft.identitymodel.logging/6.32.1/lib/net6.0/Microsoft.IdentityModel.Logging.dll","Aliases":[],"Framework":null},{"FilePath":"/Users/user/.nuget/packages/microsoft.identitymodel.protocols/6.15.1/lib/netstandard2.0/Microsoft.IdentityModel.Protocols.dll","Aliases":[],"Framework":null},{"FilePath":"/Users/user/.nuget/packages/microsoft.identitymodel.protocols.openidconnect/6.15.1/lib/netstandard2.0/Microsoft.IdentityModel.Protocols.OpenIdConnect.dll","Aliases":[],"Framework":null},{"FilePath":"/Users/user/.nuget/packages/microsoft.identitymodel.tokens/6.32.1/lib/net6.0/Microsoft.IdentityModel.Tokens.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/Microsoft.JSInterop.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/Microsoft.Net.Http.Headers.dll","Aliases":[],"Framework":null},{"FilePath":"/Users/user/.nuget/packages/microsoft.openapi/1.4.3/lib/netstandard2.0/Microsoft.OpenApi.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/Microsoft.VisualBasic.Core.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/Microsoft.VisualBasic.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/Microsoft.Win32.Primitives.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/Microsoft.Win32.Registry.dll","Aliases":[],"Framework":null},{"FilePath":"/Users/user/.nuget/packages/mongodb.bson/2.20.0/lib/netstandard2.1/MongoDB.Bson.dll","Aliases":[],"Framework":null},{"FilePath":"/Users/user/.nuget/packages/mongodb.driver.core/2.20.0/lib/netstandard2.1/MongoDB.Driver.Core.dll","Aliases":[],"Framework":null},{"FilePath":"/Users/user/.nuget/packages/mongodb.driver/2.20.0/lib/netstandard2.1/MongoDB.Driver.dll","Aliases":[],"Framework":null},{"FilePath":"/Users/user/.nuget/packages/mongodb.libmongocrypt/1.8.0/lib/netstandard2.1/MongoDB.Libmongocrypt.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/mscorlib.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/netstandard.dll","Aliases":[],"Framework":null},{"FilePath":"/Users/user/.nuget/packages/sharpcompress/0.30.1/lib/net5.0/SharpCompress.dll","Aliases":[],"Framework":null},{"FilePath":"/Users/user/.nuget/packages/snappier/1.0.0/lib/net5.0/Snappier.dll","Aliases":[],"Framework":null},{"FilePath":"/Users/user/.nuget/packages/sprache/2.3.1/lib/netstandard2.1/Sprache.dll","Aliases":[],"Framework":null},{"FilePath":"/Users/user/.nuget/packages/swashbuckle.aspnetcore.swagger/6.5.0/lib/net7.0/Swashbuckle.AspNetCore.Swagger.dll","Aliases":[],"Framework":null},{"FilePath":"/Users/user/.nuget/packages/swashbuckle.aspnetcore.swaggergen/6.5.0/lib/net7.0/Swashbuckle.AspNetCore.SwaggerGen.dll","Aliases":[],"Framework":null},{"FilePath":"/Users/user/.nuget/packages/swashbuckle.aspnetcore.swaggerui/6.5.0/lib/net7.0/Swashbuckle.AspNetCore.SwaggerUI.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.AppContext.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.Buffers.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.Collections.Concurrent.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.Collections.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.Collections.Immutable.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.Collections.NonGeneric.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.Collections.Specialized.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.ComponentModel.Annotations.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.ComponentModel.DataAnnotations.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.ComponentModel.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.ComponentModel.EventBasedAsync.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.ComponentModel.Primitives.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.ComponentModel.TypeConverter.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.Configuration.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.Console.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.Core.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.Data.Common.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.Data.DataSetExtensions.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.Data.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.Diagnostics.Contracts.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.Diagnostics.Debug.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.Diagnostics.DiagnosticSource.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/System.Diagnostics.EventLog.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.Diagnostics.FileVersionInfo.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.Diagnostics.Process.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.Diagnostics.StackTrace.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.Diagnostics.TextWriterTraceListener.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.Diagnostics.Tools.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.Diagnostics.TraceSource.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.Diagnostics.Tracing.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.Drawing.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.Drawing.Primitives.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.Dynamic.Runtime.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.Formats.Asn1.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.Formats.Tar.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.Globalization.Calendars.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.Globalization.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.Globalization.Extensions.dll","Aliases":[],"Framework":null},{"FilePath":"/Users/user/.nuget/packages/system.identitymodel.tokens.jwt/6.32.1/lib/net6.0/System.IdentityModel.Tokens.Jwt.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.IO.Compression.Brotli.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.IO.Compression.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.IO.Compression.FileSystem.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.IO.Compression.ZipFile.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.IO.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.IO.FileSystem.AccessControl.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.IO.FileSystem.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.IO.FileSystem.DriveInfo.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.IO.FileSystem.Primitives.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.IO.FileSystem.Watcher.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.IO.IsolatedStorage.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.IO.MemoryMappedFiles.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/System.IO.Pipelines.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.IO.Pipes.AccessControl.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.IO.Pipes.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.IO.UnmanagedMemoryStream.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.Linq.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.Linq.Expressions.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.Linq.Parallel.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.Linq.Queryable.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.Memory.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.Net.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.Net.Http.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.Net.Http.Json.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.Net.HttpListener.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.Net.Mail.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.Net.NameResolution.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.Net.NetworkInformation.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.Net.Ping.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.Net.Primitives.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.Net.Quic.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.Net.Requests.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.Net.Security.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.Net.ServicePoint.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.Net.Sockets.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.Net.WebClient.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.Net.WebHeaderCollection.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.Net.WebProxy.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.Net.WebSockets.Client.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.Net.WebSockets.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.Numerics.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.Numerics.Vectors.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.ObjectModel.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.Reflection.DispatchProxy.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.Reflection.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.Reflection.Emit.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.Reflection.Emit.ILGeneration.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.Reflection.Emit.Lightweight.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.Reflection.Extensions.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.Reflection.Metadata.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.Reflection.Primitives.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.Reflection.TypeExtensions.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.Resources.Reader.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.Resources.ResourceManager.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.Resources.Writer.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.Runtime.CompilerServices.Unsafe.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.Runtime.CompilerServices.VisualC.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.Runtime.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.Runtime.Extensions.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.Runtime.Handles.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.Runtime.InteropServices.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.Runtime.InteropServices.JavaScript.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.Runtime.InteropServices.RuntimeInformation.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.Runtime.Intrinsics.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.Runtime.Loader.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.Runtime.Numerics.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.Runtime.Serialization.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.Runtime.Serialization.Formatters.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.Runtime.Serialization.Json.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.Runtime.Serialization.Primitives.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.Runtime.Serialization.Xml.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.Security.AccessControl.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.Security.Claims.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.Security.Cryptography.Algorithms.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.Security.Cryptography.Cng.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.Security.Cryptography.Csp.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.Security.Cryptography.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.Security.Cryptography.Encoding.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.Security.Cryptography.OpenSsl.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.Security.Cryptography.Primitives.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.Security.Cryptography.X509Certificates.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/System.Security.Cryptography.Xml.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.Security.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.Security.Principal.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.Security.Principal.Windows.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.Security.SecureString.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.ServiceModel.Web.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.ServiceProcess.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.Text.Encoding.CodePages.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.Text.Encoding.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.Text.Encoding.Extensions.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.Text.Encodings.Web.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.Text.Json.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.Text.RegularExpressions.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.Threading.Channels.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.Threading.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.Threading.Overlapped.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/ref/net7.0/System.Threading.RateLimiting.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.Threading.Tasks.Dataflow.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.Threading.Tasks.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.Threading.Tasks.Extensions.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.Threading.Tasks.Parallel.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.Threading.Thread.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.Threading.ThreadPool.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.Threading.Timer.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.Transactions.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.Transactions.Local.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.ValueTuple.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.Web.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.Web.HttpUtility.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.Windows.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.Xml.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.Xml.Linq.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.Xml.ReaderWriter.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.Xml.Serialization.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.Xml.XDocument.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.Xml.XmlDocument.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.Xml.XmlSerializer.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.Xml.XPath.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/System.Xml.XPath.XDocument.dll","Aliases":[],"Framework":null},{"FilePath":"/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/ref/net7.0/WindowsBase.dll","Aliases":[],"Framework":null},{"FilePath":"/Users/user/.nuget/packages/zstdsharp.port/0.6.2/lib/net6.0/ZstdSharp.dll","Aliases":[],"Framework":null}],"Files":["/Users/user/Documents/projects/masters-project/crowdlaunch-backend/Controllers/AuthController.cs","/Users/user/Documents/projects/masters-project/crowdlaunch-backend/Controllers/CategoryController.cs","/Users/user/Documents/projects/masters-project/crowdlaunch-backend/Controllers/NftController.cs","/Users/user/Documents/projects/masters-project/crowdlaunch-backend/Controllers/NftLikeController.cs","/Users/user/Documents/projects/masters-project/crowdlaunch-backend/Controllers/PortfolioController.cs","/Users/user/Documents/projects/masters-project/crowdlaunch-backend/Controllers/ProjectController.cs","/Users/user/Documents/projects/masters-project/crowdlaunch-backend/Controllers/ProjectDetailController.cs","/Users/user/Documents/projects/masters-project/crowdlaunch-backend/Controllers/ProjectLikeController.cs","/Users/user/Documents/projects/masters-project/crowdlaunch-backend/Controllers/ProjectUpdateController.cs","/Users/user/Documents/projects/masters-project/crowdlaunch-backend/Controllers/UserController.cs","/Users/user/Documents/projects/masters-project/crowdlaunch-backend/Controllers/UserNft.cs","/Users/user/Documents/projects/masters-project/crowdlaunch-backend/dto/CategoryDto.cs","/Users/user/Documents/projects/masters-project/crowdlaunch-backend/dto/NftDto.cs","/Users/user/Documents/projects/masters-project/crowdlaunch-backend/dto/NftLikeDto.cs","/Users/user/Documents/projects/masters-project/crowdlaunch-backend/dto/PortfolioDto..cs","/Users/user/Documents/projects/masters-project/crowdlaunch-backend/dto/ProjectDetailDto.cs","/Users/user/Documents/projects/masters-project/crowdlaunch-backend/dto/ProjectDto.cs","/Users/user/Documents/projects/masters-project/crowdlaunch-backend/dto/ProjectLikeDto.cs","/Users/user/Documents/projects/masters-project/crowdlaunch-backend/dto/ProjectUpdateDto.cs","/Users/user/Documents/projects/masters-project/crowdlaunch-backend/dto/UserDto.cs","/Users/user/Documents/projects/masters-project/crowdlaunch-backend/dto/UserNftDto.cs","/Users/user/Documents/projects/masters-project/crowdlaunch-backend/Helpers/DatabaseConfig.cs","/Users/user/Documents/projects/masters-project/crowdlaunch-backend/Interfaces/IAuthService.cs","/Users/user/Documents/projects/masters-project/crowdlaunch-backend/Interfaces/IDefaultService.cs","/Users/user/Documents/projects/masters-project/crowdlaunch-backend/Interfaces/INftLikeService.cs","/Users/user/Documents/projects/masters-project/crowdlaunch-backend/Interfaces/INftService.cs","/Users/user/Documents/projects/masters-project/crowdlaunch-backend/Interfaces/IPortfolioService.cs","/Users/user/Documents/projects/masters-project/crowdlaunch-backend/Interfaces/IProjectDetailService.cs","/Users/user/Documents/projects/masters-project/crowdlaunch-backend/Interfaces/IProjectLikeService.cs","/Users/user/Documents/projects/masters-project/crowdlaunch-backend/Interfaces/IprojectService.cs","/Users/user/Documents/projects/masters-project/crowdlaunch-backend/Interfaces/IProjectUpdateService.cs","/Users/user/Documents/projects/masters-project/crowdlaunch-backend/Interfaces/IUserNftService.cs","/Users/user/Documents/projects/masters-project/crowdlaunch-backend/Interfaces/IUserService.cs","/Users/user/Documents/projects/masters-project/crowdlaunch-backend/MiddleWare/ErrorLoggingMiddleware.cs","/Users/user/Documents/projects/masters-project/crowdlaunch-backend/MiddleWare/TokenMiddleware.cs","/Users/user/Documents/projects/masters-project/crowdlaunch-backend/Models/Category.cs","/Users/user/Documents/projects/masters-project/crowdlaunch-backend/Models/CustomColour.cs","/Users/user/Documents/projects/masters-project/crowdlaunch-backend/Models/DefaultModel.cs","/Users/user/Documents/projects/masters-project/crowdlaunch-backend/Models/MarketPlaceDBSettings.cs","/Users/user/Documents/projects/masters-project/crowdlaunch-backend/Models/Nft.cs","/Users/user/Documents/projects/masters-project/crowdlaunch-backend/Models/NftLike.cs","/Users/user/Documents/projects/masters-project/crowdlaunch-backend/Models/Portfolio.cs","/Users/user/Documents/projects/masters-project/crowdlaunch-backend/Models/Project.cs","/Users/user/Documents/projects/masters-project/crowdlaunch-backend/Models/ProjectDetail.cs","/Users/user/Documents/projects/masters-project/crowdlaunch-backend/Models/ProjectLike.cs","/Users/user/Documents/projects/masters-project/crowdlaunch-backend/Models/ProjectUpdate.cs","/Users/user/Documents/projects/masters-project/crowdlaunch-backend/Models/Socials.cs","/Users/user/Documents/projects/masters-project/crowdlaunch-backend/Models/User.cs","/Users/user/Documents/projects/masters-project/crowdlaunch-backend/Models/UserNft.cs","/Users/user/Documents/projects/masters-project/crowdlaunch-backend/Program.cs","/Users/user/Documents/projects/masters-project/crowdlaunch-backend/Services/AuthService.cs","/Users/user/Documents/projects/masters-project/crowdlaunch-backend/Services/CategoryService.cs","/Users/user/Documents/projects/masters-project/crowdlaunch-backend/Services/NftLikeService.cs","/Users/user/Documents/projects/masters-project/crowdlaunch-backend/Services/NftService.cs","/Users/user/Documents/projects/masters-project/crowdlaunch-backend/Services/PortfolioService.cs","/Users/user/Documents/projects/masters-project/crowdlaunch-backend/Services/ProjectDetailService.cs","/Users/user/Documents/projects/masters-project/crowdlaunch-backend/Services/ProjectLikeService.cs","/Users/user/Documents/projects/masters-project/crowdlaunch-backend/Services/ProjectService.cs","/Users/user/Documents/projects/masters-project/crowdlaunch-backend/Services/ProjectUpdateService.cs","/Users/user/Documents/projects/masters-project/crowdlaunch-backend/Services/UserNftService.cs","/Users/user/Documents/projects/masters-project/crowdlaunch-backend/Services/UserService.cs","/Users/user/Documents/projects/masters-project/crowdlaunch-backend/Startup.cs","/Users/user/Documents/projects/masters-project/crowdlaunch-backend/obj/Debug/net7.0/crowdlaunch-backend.GlobalUsings.g.cs","/Users/user/Documents/projects/masters-project/crowdlaunch-backend/obj/Debug/net7.0/.NETCoreApp,Version=v7.0.AssemblyAttributes.cs","/Users/user/Documents/projects/masters-project/crowdlaunch-backend/obj/Debug/net7.0/crowdlaunch-backend.AssemblyInfo.cs","/Users/user/Documents/projects/masters-project/crowdlaunch-backend/obj/Debug/net7.0/crowdlaunch-backend.AssemblyInfo.cs","/Users/user/Documents/projects/masters-project/crowdlaunch-backend/obj/Debug/net7.0/crowdlaunch-backend.AssemblyInfo.cs","/Users/user/Documents/projects/masters-project/crowdlaunch-backend/obj/Debug/net7.0/crowdlaunch-backend.AssemblyInfo.cs"],"BuildActions":["Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile","Compile"],"Analyzers":["/usr/local/share/dotnet/sdk/7.0.101/Sdks/Microsoft.NET.Sdk.Web/analyzers/cs/Microsoft.AspNetCore.Analyzers.dll","/usr/local/share/dotnet/sdk/7.0.101/Sdks/Microsoft.NET.Sdk.Web/analyzers/cs/Microsoft.AspNetCore.Mvc.Analyzers.dll","/usr/local/share/dotnet/sdk/7.0.101/Sdks/Microsoft.NET.Sdk/analyzers/Microsoft.CodeAnalysis.CSharp.NetAnalyzers.dll","/usr/local/share/dotnet/sdk/7.0.101/Sdks/Microsoft.NET.Sdk/analyzers/Microsoft.CodeAnalysis.NetAnalyzers.dll","/Users/user/.nuget/packages/awssdk.securitytoken/3.7.100.14/analyzers/dotnet/cs/AWSSDK.SecurityToken.CodeAnalysis.dll","/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/analyzers/dotnet/cs/Microsoft.Interop.JavaScript.JSImportGenerator.dll","/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/analyzers/dotnet/cs/Microsoft.Interop.LibraryImportGenerator.dll","/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/analyzers/dotnet/cs/Microsoft.Interop.SourceGeneration.dll","/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/analyzers/dotnet/cs/System.Text.Json.SourceGeneration.dll","/usr/local/share/dotnet/packs/Microsoft.NETCore.App.Ref/7.0.1/analyzers/dotnet/cs/System.Text.RegularExpressions.Generator.dll","/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/analyzers/dotnet/cs/Microsoft.AspNetCore.App.Analyzers.dll","/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/analyzers/dotnet/cs/Microsoft.AspNetCore.App.CodeFixes.dll","/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/analyzers/dotnet/cs/Microsoft.AspNetCore.Components.Analyzers.dll","/usr/local/share/dotnet/packs/Microsoft.AspNetCore.App.Ref/7.0.1/analyzers/dotnet/roslyn4.4/cs/Microsoft.Extensions.Logging.Generators.dll","/usr/local/share/dotnet/sdk/7.0.101/Sdks/Microsoft.NET.Sdk.Razor/source-generators/Microsoft.AspNetCore.Mvc.Razor.Extensions.dll","/usr/local/share/dotnet/sdk/7.0.101/Sdks/Microsoft.NET.Sdk.Razor/source-generators/Microsoft.AspNetCore.Razor.Language.dll","/usr/local/share/dotnet/sdk/7.0.101/Sdks/Microsoft.NET.Sdk.Razor/source-generators/Microsoft.CodeAnalysis.Razor.dll","/usr/local/share/dotnet/sdk/7.0.101/Sdks/Microsoft.NET.Sdk.Razor/source-generators/Microsoft.NET.Sdk.Razor.SourceGenerators.dll"],"AdditionalFiles":[],"EditorConfigFiles":["/usr/local/share/dotnet/sdk/7.0.101/Sdks/Microsoft.NET.Sdk.Razor/source-generators/RazorSourceGenerator.razorencconfig","/Users/user/Documents/projects/masters-project/crowdlaunch-backend/obj/Debug/net7.0/crowdlaunch-backend.GeneratedMSBuildEditorConfig.editorconfig","/usr/local/share/dotnet/sdk/7.0.101/Sdks/Microsoft.NET.Sdk/analyzers/build/config/analysislevel_7_default.editorconfig"],"DefineConstants":["TRACE","DEBUG","NET","NET7_0","NETCOREAPP","NET5_0_OR_GREATER","NET6_0_OR_GREATER","NET7_0_OR_GREATER","NETCOREAPP1_0_OR_GREATER","NETCOREAPP1_1_OR_GREATER","NETCOREAPP2_0_OR_GREATER","NETCOREAPP2_1_OR_GREATER","NETCOREAPP2_2_OR_GREATER","NETCOREAPP3_0_OR_GREATER","NETCOREAPP3_1_OR_GREATER"],"IntermediateAssembly":"/Users/user/Documents/projects/masters-project/crowdlaunch-backend/obj/Debug/net7.0/crowdlaunch-backend.dll"}
\ No newline at end of file
diff --git a/.vscode/launch.json b/.vscode/launch.json
deleted file mode 100644
index 252bea5..0000000
--- a/.vscode/launch.json
+++ /dev/null
@@ -1,35 +0,0 @@
-{
- "version": "0.2.0",
- "configurations": [
- {
- // Use IntelliSense to find out which attributes exist for C# debugging
- // Use hover for the description of the existing attributes
- // For further information visit https://github.com/dotnet/vscode-csharp/blob/main/debugger-launchjson.md
- "name": ".NET Core Launch (web)",
- "type": "coreclr",
- "request": "launch",
- "preLaunchTask": "build",
- // If you have changed target frameworks, make sure to update the program path.
- "program": "${workspaceFolder}/bin/Debug/net7.0/crowdlaunch-backend.dll",
- "args": [],
- "cwd": "${workspaceFolder}",
- "stopAtEntry": false,
- // Enable launching a web browser when ASP.NET Core starts. For more information: https://aka.ms/VSCode-CS-LaunchJson-WebBrowser
- "serverReadyAction": {
- "action": "openExternally",
- "pattern": "\\bNow listening on:\\s+(https?://\\S+)"
- },
- "env": {
- "ASPNETCORE_ENVIRONMENT": "Development"
- },
- "sourceFileMap": {
- "/Views": "${workspaceFolder}/Views"
- }
- },
- {
- "name": ".NET Core Attach",
- "type": "coreclr",
- "request": "attach"
- }
- ]
-}
\ No newline at end of file
diff --git a/.vscode/settings.json b/.vscode/settings.json
new file mode 100644
index 0000000..069a4ed
--- /dev/null
+++ b/.vscode/settings.json
@@ -0,0 +1,5 @@
+{
+ "dotnet.defaultSolution": "crowdlaunch-backend.sln",
+ "docify.commentService.sidePanelReviewMode": true,
+ "docify.commentService.programmingLanguage": "c_sharp"
+}
\ No newline at end of file
diff --git a/Controllers/AuthController.cs b/Controllers/AuthController.cs
deleted file mode 100644
index a97070d..0000000
--- a/Controllers/AuthController.cs
+++ /dev/null
@@ -1,101 +0,0 @@
-using MARKETPLACEAPI.dto;
-using MARKETPLACEAPI.Models;
-using MARKETPLACEAPI.Services;
-using Microsoft.AspNetCore.Mvc;
-
-namespace MARKETPLACEAPI.Controllers;
-
-
-[ApiController]
-[Produces("application/json")]
-[Consumes("application/json")]
-[Route("api/auth/[controller]")]
-public class AuthController : ControllerBase
-{
- private readonly UserService _userService;
- private readonly AuthService _authService;
-
- public AuthController(UserService userService, AuthService authService)
- {
- _userService = userService;
- _authService = authService;
- }
-
-
- [HttpPost("register")]
- [ProducesResponseType(typeof(SignInResponseDto), 201)]
- public async Task Register(SignInRegisterDto regDto)
- {
- var user = await _userService.GetUserByWalletAddress(regDto.walletAddress);
- if (user != null)
- {
- var res = new SignInResponseDto
- {
- walletAddress = user.walletAddress,
- accountCreated = false,
- accountSignedIn = true,
- accountExists = true,
- invalidAddress = false,
- errorMessage = null,
- token = _authService.GenerateToken(user),
- };
- return Ok(res);
- }
-
- var newUser = new User
- {
- userName = regDto.userName,
- walletAddress = regDto.walletAddress,
- socials = regDto.socials,
- };
- await _userService.CreateAsync(newUser);
-
- var response = new SignInResponseDto
- {
- walletAddress = newUser.walletAddress,
- accountCreated = true,
- accountSignedIn = true,
- accountExists = false,
- invalidAddress = false,
- errorMessage = null,
- token = _authService.GenerateToken(newUser),
- };
-
- return Ok(response);
- }
-
-
- [HttpPost("login")]
- [ProducesResponseType(typeof(SignInResponseDto), StatusCodes.Status200OK)]
- public async Task Login(LoginDto loginDto)
- {
- var user = await _userService.GetUserByWalletAddress(loginDto.walletAddress!);
-
- if (user is null)
- {
- return Unauthorized(new SignInResponseDto
- {
- walletAddress = null,
- accountCreated = false,
- accountSignedIn = false,
- accountExists = false,
- invalidAddress = true,
- errorMessage = "Invalid wallet address",
- });
- }
-
- var token = _authService.GenerateToken(user);
-
- return Ok(new SignInResponseDto
- {
- walletAddress = user.walletAddress,
- accountCreated = false,
- accountSignedIn = true,
- accountExists = true,
- invalidAddress = false,
- errorMessage = null,
- token = token,
- });
- }
-}
-
diff --git a/Controllers/CategoryController.cs b/Controllers/CategoryController.cs
deleted file mode 100644
index f30a76c..0000000
--- a/Controllers/CategoryController.cs
+++ /dev/null
@@ -1,87 +0,0 @@
-using MARKETPLACEAPI.dto;
-using MARKETPLACEAPI.Models;
-using MARKETPLACEAPI.Services;
-using Microsoft.AspNetCore.Authorization;
-using Microsoft.AspNetCore.Mvc;
-
-namespace MARKETPLACEAPI.Controllers;
-
-[ApiController]
-[Produces("application/json")]
-[Consumes("application/json")]
-[Route("api/categories/[controller]")]
-public class CategoryController : ControllerBase
-{
- private readonly CategoryService _categoryService;
-
- public CategoryController(CategoryService categoryService) =>
- _categoryService = categoryService;
-
- [HttpGet]
- public async Task> Get() =>
- await _categoryService.GetAsync();
-
- [HttpGet("{id:length(24)}")]
- public async Task> Get(string id, [FromHeader] string userId)
- {
- var category = await _categoryService.GetAsync(id);
-
- if (category is null)
- {
- return NotFound();
- }
-
- return category;
- }
-
- [HttpPost]
- [Authorize]
-
- public async Task Post(CategoryCreateDto newCategory)
- {
- var category = new Category
- {
- categoryName = newCategory.categoryName,
- categoryDescription = newCategory.categoryDescription,
- };
- await _categoryService.CreateAsync(category);
-
- return CreatedAtAction(nameof(Get), new { id = category.categoryId }, category);
- }
-
- [HttpPatch("{id:length(24)}")]
- [Authorize]
- public async Task Update(string id, CategoryUpdateDto updatedCategory)
- {
- var category = await _categoryService.GetAsync(id);
-
- if (category is null)
- {
- return NotFound();
- }
-
- category.categoryName = updatedCategory.categoryName;
- category.categoryDescription = updatedCategory.categoryDescription;
- category.updatedAt = DateTime.UtcNow;
-
- await _categoryService.UpdateAsync(id, category);
-
- return NoContent();
- }
-
- [HttpDelete("{id:length(24)}")]
- [Authorize]
- public async Task Delete(string id)
- {
- var category = await _categoryService.GetAsync(id);
-
- if (category is null)
- {
- return NotFound();
- }
-
- await _categoryService.RemoveAsync(id);
-
- return NoContent();
- }
-}
\ No newline at end of file
diff --git a/Controllers/NftController.cs b/Controllers/NftController.cs
deleted file mode 100644
index 67a9314..0000000
--- a/Controllers/NftController.cs
+++ /dev/null
@@ -1,122 +0,0 @@
-using MARKETPLACEAPI.dto;
-using MARKETPLACEAPI.Models;
-using MARKETPLACEAPI.Services;
-using Microsoft.AspNetCore.Authorization;
-using Microsoft.AspNetCore.Mvc;
-
-namespace MARKETPLACEAPI.Controllers;
-
-[ApiController]
-[Produces("application/json")]
-[Consumes("application/json")]
-[Route("api/user/[controller]")]
-public class NftController : ControllerBase
-{
- private readonly NftService _nftService;
- private readonly CategoryService _categoryService;
-
- public NftController(NftService nftService, CategoryService categoryService)
- {
- _nftService = nftService;
- _categoryService = categoryService;
- }
-
- [HttpGet]
- public async Task> Get() =>
- await _nftService.GetAsync();
-
- [HttpGet("{id:length(24)}")]
- public async Task> Get(string id)
- {
- var nft = await _nftService.GetAsync(id);
- if (nft is null)
- {
- return NotFound();
- }
-
- var nftDto = new NftDto
- {
- nft = nft,
- category = await _categoryService.GetAsync(nft.categoryId),
- };
-
- return nftDto;
- }
-
- [HttpPost]
- [Authorize]
- public async Task Post(NftCreateDto newNft)
- {
- var userId = HttpContext.Request.Headers["userId"].ToString();
-
- var nft = new Nft
- {
- nftName = newNft.nftName,
- nftDescription = newNft.nftDescription,
- price = newNft.price,
- ownerId = userId,
- creatorId = userId,
- categoryId = newNft.categoryId
- };
-
- await _nftService.CreateAsync(nft);
-
- return CreatedAtAction(nameof(Get), new { id = nft.nftId }, nft);
- }
-
- [HttpPatch("{id:length(24)}")]
- [Authorize]
- public async Task Update(string id, NftUpdateDto updatedNft)
- {
- var nft = await _nftService.GetAsync(id);
-
- if (nft is null)
- {
- return NotFound();
- }
-
- nft.nftName = updatedNft.nftName ?? nft.nftName;
- nft.nftDescription = updatedNft.nftDescription ?? nft.nftDescription;
- nft.price = updatedNft.price ?? nft.price;
- nft.updatedAt = DateTime.UtcNow;
-
-
- await _nftService.UpdateAsync(id, nft);
-
- return NoContent();
- }
-
- [HttpDelete("{id:length(24)}")]
- [Authorize]
- public async Task Delete(string id)
- {
- var nft = await _nftService.GetAsync(id);
-
- if (nft is null)
- {
- return NotFound();
- }
-
- await _nftService.RemoveAsync(id);
-
- return NoContent();
- }
-
- [HttpGet("creator")]
- public async Task> GetNftsByCreatorId([FromQuery] string creatorId) =>
- await _nftService.GetNftsByCreatorId(creatorId);
-
- [HttpGet("owner")]
- public async Task> GetNftsByOwnerId([FromQuery] string ownerId) =>
- await _nftService.GetNftsByOwnerId(ownerId);
-
- [HttpGet("with-price-filter")]
- public async Task> GetNftWithPriceFilter(
- [FromQuery] double? priceMax, [FromQuery] double?
- priceMin, [FromQuery] bool? ascending = true) =>
- await _nftService.GetNftWithPriceFilter(priceMax, priceMin, ascending);
-
- [HttpGet("search")]
- public async Task> SearchByNftName([FromQuery] string nftName, [FromQuery] bool ascending = true) =>
- await _nftService.SearchByNftName(nftName, ascending);
-}
\ No newline at end of file
diff --git a/Controllers/NftLikeController.cs b/Controllers/NftLikeController.cs
deleted file mode 100644
index be4695d..0000000
--- a/Controllers/NftLikeController.cs
+++ /dev/null
@@ -1,151 +0,0 @@
-using MARKETPLACEAPI.dto;
-using MARKETPLACEAPI.Models;
-using MARKETPLACEAPI.Services;
-using Microsoft.AspNetCore.Authorization;
-using Microsoft.AspNetCore.Mvc;
-
-namespace MARKETPLACEAPI.Controllers;
-
-[ApiController]
-[Produces("application/json")]
-[Consumes("application/json")]
-[Authorize]
-[Route("api/nftlikes/[controller]")]
-public class NftLikeController : ControllerBase
-{
- private readonly NftLikeService _nftLikeService;
- private readonly NftService _nftService;
-
- public NftLikeController(NftLikeService nftLikeService, NftService nftService)
- {
- _nftLikeService = nftLikeService;
- _nftService = nftService;
- }
-
- [HttpGet]
- public async Task> Get() =>
- await _nftLikeService.GetAsync();
-
- [HttpGet("{id:length(24)}")]
- public async Task> Get(string id)
- {
- var nftLike = await _nftLikeService.GetAsync(id);
-
- if (nftLike is null)
- {
- return NotFound();
- }
-
- return nftLike;
- }
-
- [HttpPost]
- [ProducesResponseType(StatusCodes.Status201Created)]
- [ProducesResponseType(StatusCodes.Status400BadRequest)]
- [ProducesResponseType(StatusCodes.Status404NotFound)]
- public async Task Post(NftLikeCreateDto newNftLike)
- {
- var userId = HttpContext.Request.Headers["userId"].ToString();
- var nft = await _nftService.GetAsync(newNftLike.nftId);
-
- if (nft is null)
- {
- return NotFound("NFT not found");
- }
-
- var nftLike = await _nftLikeService.GetNftLikeByUserIdAndNftId(userId, newNftLike.nftId);
-
- if (nftLike != null)
- {
- return BadRequest("You already liked this NFT");
- }
-
- var newLike = new NftLike
- {
- nftId = newNftLike.nftId,
- userId = userId,
- };
- await _nftLikeService.CreateAsync(newLike);
-
- nft.noOfLikes += 1;
- nft.updatedAt = DateTime.UtcNow;
- await _nftService.UpdateAsync(nft.nftId!, nft);
-
- return CreatedAtAction(nameof(Get), new { id = newLike.nftLikeId }, newLike);
- }
-
- [HttpPatch("{id:length(24)}")]
- public async Task Update(string id, NftLike updatedNftLike)
- {
- var nftLike = await _nftLikeService.GetAsync(id);
-
- if (nftLike is null)
- {
- return NotFound();
- }
-
- updatedNftLike.nftLikeId = nftLike.nftLikeId;
-
- await _nftLikeService.UpdateAsync(id, updatedNftLike);
-
- return NoContent();
- }
-
- [HttpDelete("{id:length(24)}")]
- public async Task Delete(string id)
- {
- var userId = HttpContext.Request.Headers["userId"].ToString();
- var nftLike = await _nftLikeService.GetAsync(id);
-
- if (nftLike is null)
- {
- return NotFound();
- }
-
- if (nftLike.userId != userId)
- {
- return BadRequest("You can only delete your own likes");
- }
-
- var nft = await _nftService.GetAsync(nftLike.nftId!);
-
- await _nftLikeService.RemoveAsync(id);
-
- nft!.noOfLikes -= 1;
- nft.updatedAt = DateTime.UtcNow;
- await _nftService.UpdateAsync(nft.nftId!, nft);
-
- return NoContent();
- }
-
- [HttpGet("get-by-nft-id")]
- public async Task> GetNftLikeByNftId([FromQuery] string nftId)
- {
- var nftLike = await _nftLikeService.GetNftLikeByNftId(nftId);
-
- if (nftLike is null)
- {
- return NotFound();
- }
-
- return nftLike;
- }
-
- [HttpGet("get-by-user-id")]
- public async Task> GetNftLikesByUserId([FromQuery] string userId) =>
- await _nftLikeService.GetNftLikesByUserId(userId);
-
-
- [HttpGet("get-by-user-id-and-nft-id")]
- public async Task> GetNftLikeByUserIdAndNftId([FromQuery] string userId, [FromQuery] string nftId)
- {
- var nftLike = await _nftLikeService.GetNftLikeByUserIdAndNftId(userId, nftId);
-
- if (nftLike is null)
- {
- return NotFound();
- }
-
- return nftLike;
- }
-}
\ No newline at end of file
diff --git a/Controllers/PortfolioController.cs b/Controllers/PortfolioController.cs
deleted file mode 100644
index 56a85e8..0000000
--- a/Controllers/PortfolioController.cs
+++ /dev/null
@@ -1,124 +0,0 @@
-using MARKETPLACEAPI.dto;
-using MARKETPLACEAPI.Models;
-using MARKETPLACEAPI.Services;
-using Microsoft.AspNetCore.Authorization;
-using Microsoft.AspNetCore.Mvc;
-
-namespace MARKETPLACEAPI.Controllers;
-
-[ApiController]
-[Produces("application/json")]
-[Consumes("application/json")]
-[Authorize]
-[Route("api/portfolios/[controller]")]
-public class PortfolioController : ControllerBase
-{
- private readonly PortfolioService _portfolioService;
- private readonly ProjectService _projectService;
-
- public PortfolioController(PortfolioService portfolioService, ProjectService projectService)
- {
- _portfolioService = portfolioService;
- _projectService = projectService;
- }
-
- [HttpGet]
- public async Task> Get() =>
- await _portfolioService.GetAsync();
-
- [HttpGet("{id:length(24)}")]
- public async Task> Get(string id)
- {
- var portfolio = await _portfolioService.GetAsync(id);
-
- if (portfolio is null)
- {
- return NotFound();
- }
-
- return portfolio;
- }
-
- [HttpPost]
- public async Task Post(PortfolioCreateDto newPortfolio)
- {
- var userId = HttpContext.Request.Headers["userId"].ToString();
-
- var existingPortfolio = await _portfolioService.GetPortfolioByUserIdAndProjectId(userId, newPortfolio.projectId);
-
- var project = await _projectService.GetAsync(newPortfolio.projectId);
-
- if (project is null)
- {
- return NotFound("Project not found");
- }
-
- if (existingPortfolio != null && project != null)
- {
- existingPortfolio.amountInvested += newPortfolio.amountInvested;
- project.amountRaised += newPortfolio.amountInvested;
- project.updatedAt = DateTime.UtcNow;
- await _portfolioService.UpdateAsync(existingPortfolio.portfolioId!, existingPortfolio);
- await _projectService.UpdateAsync(project.projectId!, project);
- return Ok(existingPortfolio);
- }
-
- var portfolio = new Portfolio
- {
- projectId = newPortfolio.projectId,
- userId = userId,
- status = newPortfolio.status,
- amountInvested = newPortfolio.amountInvested,
- investmentDate = newPortfolio.investmentDate
- };
- await _portfolioService.CreateAsync(portfolio);
-
- project!.amountRaised += newPortfolio.amountInvested;
- project.noOfInvestors += 1;
- project.updatedAt = DateTime.UtcNow;
- await _projectService.UpdateAsync(project.projectId!, project);
-
-
- return CreatedAtAction(nameof(Get), new { id = portfolio.portfolioId }, portfolio);
- }
-
- [HttpPatch("{id:length(24)}")]
- public async Task Update(string id, Portfolio updatedPortfolio)
- {
- var portfolio = await _portfolioService.GetAsync(id);
-
- if (portfolio is null)
- {
- return NotFound();
- }
-
- updatedPortfolio.portfolioId = portfolio.portfolioId;
-
- await _portfolioService.UpdateAsync(id, updatedPortfolio);
-
- return NoContent();
- }
-
- [HttpDelete("{id:length(24)}")]
- public async Task Delete(string id)
- {
- var portfolio = await _portfolioService.GetAsync(id);
-
- if (portfolio is null)
- {
- return NotFound();
- }
-
- await _portfolioService.RemoveAsync(id);
-
- return NoContent();
- }
-
- [HttpGet("get-by-userid")]
- public async Task> GetPortfolioByUserId([FromQuery] string userId) =>
- await _portfolioService.GetPortfolioByUserId(userId);
-
- [HttpGet("get-by-projectid")]
- public async Task> GetPortfolioByProjectId([FromQuery] string projectId) =>
- await _portfolioService.GetPortfolioByProjectId(projectId);
-}
\ No newline at end of file
diff --git a/Controllers/ProjectController.cs b/Controllers/ProjectController.cs
deleted file mode 100644
index b1cf961..0000000
--- a/Controllers/ProjectController.cs
+++ /dev/null
@@ -1,173 +0,0 @@
-using MARKETPLACEAPI.dto;
-using MARKETPLACEAPI.Models;
-using MARKETPLACEAPI.Services;
-using Microsoft.AspNetCore.Authorization;
-using Microsoft.AspNetCore.Mvc;
-
-namespace MARKETPLACEAPI.Controllers;
-
-[ApiController]
-[Produces("application/json")]
-[Consumes("application/json")]
-[Route("api/projects/[controller]")]
-public class ProjectController : ControllerBase
-{
- private readonly ProjectService _projectService;
- private readonly ProjectUpdateService _projectUpdateService;
- private readonly ProjectDetailService _projectDetailService;
- private readonly CategoryService _categoryService;
-
- public ProjectController(ProjectService projectService, ProjectUpdateService projectUpdateService,
- ProjectDetailService projectDetailService, CategoryService categoryService)
- {
- _projectService = projectService;
- _projectUpdateService = projectUpdateService;
- _projectDetailService = projectDetailService;
- _categoryService = categoryService;
- }
-
- [HttpGet]
- public async Task> Get() =>
- await _projectService.GetAsync();
-
- [HttpGet("{id:length(24)}")]
- public async Task> Get(string id)
- {
- var project = await _projectService.GetAsync(id);
-
- if (project is null)
- {
- return NotFound();
- }
-
- var projectUpdates = await _projectUpdateService.GetProjectUpdatesByProjectId(id);
- var projectDetail = await _projectDetailService.GetProjectDetailsByProjectId(id);
- var category = await _categoryService.GetAsync(project.categoryId!);
-
- var projectDto = new ProjectDto
- {
- project = project,
- projectUpdates = projectUpdates,
- projectDetails = projectDetail,
- category = category
- };
-
- return Ok(projectDto);
- }
-
- [HttpPost]
- [Authorize]
- public async Task Post(ProjectCreateDto newProject)
- {
- var userId = HttpContext.Request.Headers["userId"].ToString();
-
- var existingProject = await _projectService.GetProjectByWalletAddress(newProject.projectWalletAddress);
-
- if (existingProject is not null)
- {
- return BadRequest("Project with this wallet address already exists");
- }
-
- var project = new Project
- {
- userId = userId,
- categoryId = newProject.categoryId,
- projectName = newProject.projectName,
- bannerImageUrl = newProject.bannerImageUrl,
- targetAmount = newProject.targetAmount,
- minInvestment = newProject.minInvestment,
- noOfDaysLeft = newProject.noOfDaysLeft,
- projectWalletAddress = newProject.projectWalletAddress,
- customColour = newProject.customColour,
- projectStatus = newProject.projectStatus,
- amountRaised = newProject.amountRaised
- };
-
- await _projectService.CreateAsync(project);
-
- return CreatedAtAction(nameof(Get), new { id = project.projectId }, project);
- }
-
- [HttpPatch("{id:length(24)}")]
- [Authorize]
- public async Task Update(string id, UpdateProjectDto updatedProject)
- {
-
- var project = await _projectService.GetAsync(id);
-
- if (project is null)
- {
- return NotFound();
- }
-
- project.projectName = updatedProject.projectName ?? project.projectName;
- project.bannerImageUrl = updatedProject.bannerImageUrl ?? project.bannerImageUrl;
- project.targetAmount = updatedProject.targetAmount;
- project.minInvestment = updatedProject.minInvestment;
- project.noOfDaysLeft = updatedProject.noOfDaysLeft;
- project.projectWalletAddress = updatedProject.projectWalletAddress ?? project.projectWalletAddress;
- project.customColour = updatedProject.customColour ?? project.customColour;
- project.projectStatus = updatedProject.projectStatus;
- project.amountRaised = updatedProject.amountRaised;
- project.categoryId = updatedProject.categoryId ?? project.categoryId;
- project.updatedAt = DateTime.UtcNow;
-
-
-
- await _projectService.UpdateAsync(id, project);
-
- return NoContent();
- }
-
- [HttpDelete("{id:length(24)}")]
- public async Task Delete(string id)
- {
- var project = await _projectService.GetAsync(id);
-
- if (project is null)
- {
- return NotFound();
- }
-
- await _projectService.RemoveAsync(id);
-
- return NoContent();
- }
-
- [HttpGet("get-by-userid")]
- public async Task> GetProjectsByUserId([FromQuery] string userId) =>
- await _projectService.GetProjectsByUserId(userId);
-
- [HttpGet("search")]
- public async Task> SearchProjects([FromQuery] string projectName, [FromQuery] bool ascending) =>
- await _projectService.SearchByProjectName(projectName, ascending);
-
- [HttpGet("get-by-wallet-address")]
- public async Task> GetProjectByWalletAddress([FromQuery] string walletAddress)
- {
- var project = await _projectService.GetProjectByWalletAddress(walletAddress);
-
- if (project is null)
- {
- return NotFound();
- }
-
- return project;
- }
-
-
- [HttpGet("get-with-filters")]
- public async Task> GetProjectWithFilters([FromQuery] string? search,
- [FromQuery] bool? newest, [FromQuery] bool? trending, [FromQuery] Status? active,
- [FromQuery] bool? mostLiked, [FromQuery] List categoryIds, [FromQuery] double? minInvestmentMin,
- [FromQuery] double? minInvestmentMax, [FromQuery] bool? minIvestmentAsc,
- [FromQuery] double? amountRaisedMin, [FromQuery] double? amountRaisedMax, [FromQuery] bool? amountRaisedAsc,
- [FromQuery] double? targetAmountMin, [FromQuery] double? targetAmountMax, [FromQuery] bool? targetAmountAsc,
- [FromQuery] int? noOfDaysLeftMin, [FromQuery] int? noOfDaysLeftMax, [FromQuery] bool? noOfDaysLeftAsc,
- [FromQuery] bool? ascending = false) =>
- await _projectService.GetProjectWithFilters(search,
- newest, trending, active, mostLiked, categoryIds, minInvestmentMin, minInvestmentMax, minIvestmentAsc,
- amountRaisedMin, amountRaisedMax, amountRaisedAsc, targetAmountMin, targetAmountMax,
- targetAmountAsc, noOfDaysLeftMin, noOfDaysLeftMax, noOfDaysLeftAsc, ascending
- );
-}
\ No newline at end of file
diff --git a/Controllers/ProjectDetailController.cs b/Controllers/ProjectDetailController.cs
deleted file mode 100644
index fdf6254..0000000
--- a/Controllers/ProjectDetailController.cs
+++ /dev/null
@@ -1,106 +0,0 @@
-using MARKETPLACEAPI.dto;
-using MARKETPLACEAPI.Models;
-using MARKETPLACEAPI.Services;
-using Microsoft.AspNetCore.Authorization;
-using Microsoft.AspNetCore.Mvc;
-
-namespace MARKETPLACEAPI.Controllers;
-
-[ApiController]
-[Produces("application/json")]
-[Consumes("application/json")]
-[Route("api/project-details/[controller]")]
-public class ProjectDetailController : ControllerBase
-{
- private readonly ProjectDetailService _projectDetailService;
-
- public ProjectDetailController(ProjectDetailService projectDetailService) =>
- _projectDetailService = projectDetailService;
-
- [HttpGet]
- public async Task> Get() =>
- await _projectDetailService.GetAsync();
-
- [HttpGet("{id:length(24)}")]
- public async Task> Get(string id)
- {
- var projectDetail = await _projectDetailService.GetAsync(id);
-
- if (projectDetail is null)
- {
- return NotFound();
- }
-
- return projectDetail;
- }
-
- [HttpPost]
- [Authorize]
- public async Task Post(ProjectDetailCreateDto newProjectDetail)
- {
- var existingProjectDetail = await _projectDetailService.GetProjectDetailsByProjectId(newProjectDetail.projectId!);
-
- if (existingProjectDetail is not null)
- {
- return Conflict("Project Details already exists for this project.");
- }
-
- var projectDetail = new ProjectDetail
- {
- projectId = newProjectDetail.projectId,
- overview = newProjectDetail.overview,
- competitors = newProjectDetail.competitors,
- strategy = newProjectDetail.strategy,
- financials = newProjectDetail.financials,
- dividend = newProjectDetail.dividend,
- risks = newProjectDetail.risks,
- performance = newProjectDetail.performance
- };
-
- await _projectDetailService.CreateAsync(projectDetail);
-
- return CreatedAtAction(nameof(Get), new { id = projectDetail.projectDetailId }, projectDetail);
- }
-
- [HttpPatch("{id:length(24)}")]
- [Authorize]
- public async Task Update(string id, ProjectDetailCreateDto updatedProjectDetail)
- {
- var projectDetail = await _projectDetailService.GetAsync(id);
-
- if (projectDetail is null)
- {
- return NotFound();
- }
-
- projectDetail.projectId = updatedProjectDetail.projectId ?? projectDetail.projectId;
- projectDetail.overview = updatedProjectDetail.overview ?? projectDetail.overview;
- projectDetail.competitors = updatedProjectDetail.competitors ?? projectDetail.competitors;
- projectDetail.strategy = updatedProjectDetail.strategy ?? projectDetail.strategy;
- projectDetail.financials = updatedProjectDetail.financials ?? projectDetail.financials;
- projectDetail.dividend = updatedProjectDetail.dividend ?? projectDetail.dividend;
- projectDetail.risks = updatedProjectDetail.risks ?? projectDetail.risks;
- projectDetail.performance = updatedProjectDetail.performance ?? projectDetail.performance;
- projectDetail.updatedAt = DateTime.UtcNow;
-
- await _projectDetailService.UpdateAsync(id, projectDetail);
-
- return NoContent();
- }
-
- [HttpDelete("{id:length(24)}")]
- [Authorize]
- public async Task Delete(string id)
- {
- var projectDetail = await _projectDetailService.GetAsync(id);
-
- if (projectDetail is null)
- {
- return NotFound();
- }
-
- await _projectDetailService.RemoveAsync(id);
-
- return NoContent();
- }
-}
\ No newline at end of file
diff --git a/Controllers/ProjectLikeController.cs b/Controllers/ProjectLikeController.cs
deleted file mode 100644
index 9f3bb6e..0000000
--- a/Controllers/ProjectLikeController.cs
+++ /dev/null
@@ -1,136 +0,0 @@
-using MARKETPLACEAPI.dto;
-using MARKETPLACEAPI.Models;
-using MARKETPLACEAPI.Services;
-using Microsoft.AspNetCore.Authorization;
-using Microsoft.AspNetCore.Mvc;
-
-namespace MARKETPLACEAPI.Controllers;
-
-[ApiController]
-[Produces("application/json")]
-[Consumes("application/json")]
-[Authorize]
-[Route("api/project-likes/[controller]")]
-public class ProjectLikeController : ControllerBase
-{
- private readonly ProjectLikeService _projectLikeService;
- private readonly ProjectService _projectService;
-
- public ProjectLikeController(ProjectLikeService projectLikeService, ProjectService projectService)
- {
- _projectLikeService = projectLikeService;
- _projectService = projectService;
- }
-
-
- [HttpGet]
- public async Task> Get() =>
- await _projectLikeService.GetAsync();
-
- [HttpGet("{id:length(24)}")]
- public async Task> Get(string id)
- {
- var projectLike = await _projectLikeService.GetAsync(id);
-
- if (projectLike is null)
- {
- return NotFound();
- }
-
- return projectLike;
- }
-
- [HttpPost]
- public async Task Post(ProjectLikeCreateDto newProjectLike)
- {
- var userId = HttpContext.Request.Headers["userId"].ToString();
- var existingProjectLike = await _projectLikeService.GetProjectLikeByUserIdAndProjectId(
- userId, newProjectLike.projectId);
-
- if (existingProjectLike is not null)
- {
- return Conflict("Project Like already exists for this user and project.");
- }
-
- var projectLike = new ProjectLike
- {
- projectId = newProjectLike.projectId,
- userId = userId
- };
- var project = await _projectService.GetAsync(projectLike.projectId);
-
- if (project is null)
- {
- return NotFound();
- }
- await _projectLikeService.CreateAsync(projectLike);
-
-
- project.noOfLikes += 1;
- await _projectService.UpdateAsync(projectLike.projectId, project);
-
- return CreatedAtAction(nameof(Get), new { id = projectLike.projectLikeId }, projectLike);
- }
-
- [HttpPatch("{id:length(24)}")]
- public async Task Update(string id, ProjectLike updatedProjectLike)
- {
- var projectLike = await _projectLikeService.GetAsync(id);
-
- if (projectLike is null)
- {
- return NotFound();
- }
-
- updatedProjectLike.projectLikeId = projectLike.projectLikeId;
-
- await _projectLikeService.UpdateAsync(id, updatedProjectLike);
-
- return NoContent();
- }
-
- [HttpDelete("{id:length(24)}")]
- public async Task Delete(string id)
- {
- var projectLike = await _projectLikeService.GetAsync(id);
- if (projectLike is null)
- {
- return NotFound();
- }
- var project = await _projectService.GetAsync(projectLike.projectId!);
-
- if (project is null)
- {
- return NotFound("Project not found.");
- }
-
- project.noOfLikes -= 1;
- await _projectService.UpdateAsync(projectLike.projectId!, project);
-
-
- await _projectLikeService.RemoveAsync(id);
-
-
- return NoContent();
- }
-
- [HttpGet("get-by-projectid")]
- public async Task> GetByProjectId([FromQuery] string projectId) =>
- await _projectLikeService.GetProjectLikeByProjectId(projectId);
-
- [HttpGet("get-by-userid")]
- public async Task> GetByUserId([FromQuery] string userId) =>
- await _projectLikeService.GetProjectLikesByUserId(userId);
-
- [HttpGet("get-by-userid-and-projectid")]
- public async Task> GetByUserIdAndProjectId([FromQuery] string userId, [FromQuery] string projectId)
- {
- var projectLike = await _projectLikeService.GetProjectLikeByUserIdAndProjectId(userId, projectId);
- if (projectLike is null)
- {
- return NotFound();
- }
- return projectLike;
- }
-
-}
\ No newline at end of file
diff --git a/Controllers/ProjectUpdateController.cs b/Controllers/ProjectUpdateController.cs
deleted file mode 100644
index 75d6180..0000000
--- a/Controllers/ProjectUpdateController.cs
+++ /dev/null
@@ -1,89 +0,0 @@
-using MARKETPLACEAPI.dto;
-using MARKETPLACEAPI.Models;
-using MARKETPLACEAPI.Services;
-using Microsoft.AspNetCore.Authorization;
-using Microsoft.AspNetCore.Mvc;
-
-namespace MARKETPLACEAPI.Controllers;
-
-[ApiController]
-[Produces("application/json")]
-[Consumes("application/json")]
-[Route("api/project-updates/[controller]")]
-public class ProjectUpdateController : ControllerBase
-{
- private readonly ProjectUpdateService _projectUpdateService;
-
- public ProjectUpdateController(ProjectUpdateService projectUpdateService) =>
- _projectUpdateService = projectUpdateService;
-
- [HttpGet]
- public async Task> Get() =>
- await _projectUpdateService.GetAsync();
-
- [HttpGet("{id:length(24)}")]
- public async Task> Get(string id)
- {
- var projectUpdate = await _projectUpdateService.GetAsync(id);
-
- if (projectUpdate is null)
- {
- return NotFound();
- }
-
- return projectUpdate;
- }
-
- [HttpPost]
- [Authorize]
- public async Task Post(ProjectUpdateCreateDto newProjectUpdate)
- {
- var projectUpdate = new ProjectUpdate
- {
- projectId = newProjectUpdate.projectId,
- updateTitle = newProjectUpdate.updateTitle,
- updateMessage = newProjectUpdate.updateMessage
- };
- await _projectUpdateService.CreateAsync(projectUpdate);
-
- return CreatedAtAction(nameof(Get), new { id = projectUpdate.projectUpdateId }, projectUpdate);
- }
-
- [HttpPatch("{id:length(24)}")]
- [Authorize]
- public async Task Update(string id, ProjectUpdateCreateDto updatedProjectUpdate)
- {
-
- var projectUpdate = await _projectUpdateService.GetAsync(id);
-
- if (projectUpdate is null)
- {
- return NotFound();
- }
-
- projectUpdate.projectId = updatedProjectUpdate.projectId;
- projectUpdate.updateTitle = updatedProjectUpdate.updateTitle;
- projectUpdate.updateMessage = updatedProjectUpdate.updateMessage;
- projectUpdate.updatedAt = DateTime.UtcNow;
-
- await _projectUpdateService.UpdateAsync(id, projectUpdate);
-
- return NoContent();
- }
-
- [HttpDelete("{id:length(24)}")]
- [Authorize]
- public async Task Delete(string id)
- {
- var projectUpdate = await _projectUpdateService.GetAsync(id);
-
- if (projectUpdate is null)
- {
- return NotFound();
- }
-
- await _projectUpdateService.RemoveAsync(id);
-
- return NoContent();
- }
-}
\ No newline at end of file
diff --git a/Controllers/UserController.cs b/Controllers/UserController.cs
deleted file mode 100644
index fb9a44b..0000000
--- a/Controllers/UserController.cs
+++ /dev/null
@@ -1,172 +0,0 @@
-using MARKETPLACEAPI.dto;
-using MARKETPLACEAPI.Models;
-using MARKETPLACEAPI.Services;
-using Microsoft.AspNetCore.Authorization;
-using Microsoft.AspNetCore.Mvc;
-
-namespace MARKETPLACEAPI.Controllers;
-
-[ApiController]
-[Produces("application/json")]
-[Consumes("application/json")]
-[Authorize]
-[Route("api/user/[controller]")]
-public class UserController : ControllerBase
-{
- private readonly UserService _userService;
- private readonly PortfolioService _portfolioService;
- private readonly ProjectService _projectService;
- private readonly UserNftService _userNftService;
- private readonly ProjectLikeService _projectLikeService;
- private readonly NftLikeService _nftLikeService;
-
- public UserController(UserService userService, PortfolioService portfolioService,
- ProjectService projectService, UserNftService userNftService,
- ProjectLikeService projectLikeService, NftLikeService nftLikeService)
- {
- _userService = userService;
- _portfolioService = portfolioService;
- _projectService = projectService;
- _userNftService = userNftService;
- _projectLikeService = projectLikeService;
- _nftLikeService = nftLikeService;
- }
-
-
- [HttpGet]
- public async Task> Get() =>
- await _userService.GetAsync();
-
- [HttpGet("{id:length(24)}")]
- public async Task> Get(string id)
- {
- var user = await _userService.GetAsync(id);
-
- if (user is null)
- {
- return NotFound();
- }
-
- var portfolios = await _portfolioService.GetPortfolioByUserId(user.userId!);
- var nftWatchlist = await _nftLikeService.GetNftLikesByUserId(user.userId!);
- var projectWatchlist = await _projectLikeService.GetProjectLikesByUserId(user.userId!);
- var ownedNfts = await _userNftService.GetUserNftByUserId(user.userId!);
- var listedProjects = await _projectService.GetProjectsByUserId(user.userId!);
-
- var userDto = new UserDto
- {
- user = user,
- portfolios = portfolios,
- nftWatchlist = nftWatchlist,
- projectWatchlist = projectWatchlist,
- ownedNfts = ownedNfts,
- listedProjects = listedProjects
- };
-
- return Ok(userDto);
- }
-
- [HttpPost]
- public async Task Post(User newUser)
- {
- await _userService.CreateAsync(newUser);
-
- return CreatedAtAction(nameof(Get), new { id = newUser.userId }, newUser);
- }
-
- [HttpPatch]
- public async Task Update(UserUpdateDto updatedUser)
- {
- var id = HttpContext.Request.Headers["userId"].ToString();
- var user = await _userService.GetAsync(id);
-
- if (user is null)
- {
- return NotFound();
- }
-
- user.userName = updatedUser.userName;
- user.socials = updatedUser.socials;
- user.updatedAt = updatedUser.updatedAt;
-
-
- await _userService.UpdateAsync(id, user);
-
- return NoContent();
- }
-
- [HttpDelete("{id:length(24)}")]
- public async Task Delete(string id)
- {
- var user = await _userService.GetAsync(id);
-
- if (user is null)
- {
- return NotFound();
- }
-
- await _userService.RemoveAsync(id);
-
- return NoContent();
- }
-
- [HttpGet("get-by-wallet-address")]
- public async Task> GetByWalletAddress([FromHeader] string walletAddress)
- {
- var user = await _userService.GetUserByWalletAddress(walletAddress);
-
- if (user is null)
- {
- return NotFound();
- }
-
- var portfolios = await _portfolioService.GetPortfolioByUserId(user.userId!);
- var nftWatchlist = await _nftLikeService.GetNftLikesByUserId(user.userId!);
- var projectWatchlist = await _projectLikeService.GetProjectLikesByUserId(user.userId!);
- var ownedNfts = await _userNftService.GetUserNftByUserId(user.userId!);
- var listedProjects = await _projectService.GetProjectsByUserId(user.userId!);
-
- var userDto = new UserDto
- {
- user = user,
- portfolios = portfolios,
- nftWatchlist = nftWatchlist,
- projectWatchlist = projectWatchlist,
- ownedNfts = ownedNfts,
- listedProjects = listedProjects
- };
-
- return Ok(userDto);
- }
-
- [HttpGet("me")]
- public async Task> GetMe()
- {
- var userId = HttpContext.Request.Headers["userId"].ToString();
- var user = await _userService.GetAsync(userId);
-
- if (user is null)
- {
- return NotFound();
- }
-
- var portfolios = await _portfolioService.GetPortfolioByUserId(user.userId!);
- var nftWatchlist = await _nftLikeService.GetNftLikesByUserId(user.userId!);
- var projectWatchlist = await _projectLikeService.GetProjectLikesByUserId(user.userId!);
- var ownedNfts = await _userNftService.GetUserNftByUserId(user.userId!);
- var listedProjects = await _projectService.GetProjectsByUserId(user.userId!);
-
- var userDto = new UserDto
- {
- user = user,
- portfolios = portfolios,
- nftWatchlist = nftWatchlist,
- projectWatchlist = projectWatchlist,
- ownedNfts = ownedNfts,
- listedProjects = listedProjects
- };
-
- return Ok(userDto);
- }
-
-}
\ No newline at end of file
diff --git a/Controllers/UserNft.cs b/Controllers/UserNft.cs
deleted file mode 100644
index f6795b4..0000000
--- a/Controllers/UserNft.cs
+++ /dev/null
@@ -1,115 +0,0 @@
-using MARKETPLACEAPI.dto;
-using MARKETPLACEAPI.Models;
-using MARKETPLACEAPI.Services;
-using Microsoft.AspNetCore.Authorization;
-using Microsoft.AspNetCore.Mvc;
-
-namespace MARKETPLACEAPI.Controllers;
-
-[ApiController]
-[Produces("application/json")]
-[Consumes("application/json")]
-[Authorize]
-[Route("api/user-nfts/[controller]")]
-public class UserNftController : ControllerBase
-{
- private readonly UserNftService _userNftService;
-
- public UserNftController(UserNftService userNftService) =>
- _userNftService = userNftService;
-
- [HttpGet]
- public async Task> Get() =>
- await _userNftService.GetAsync();
-
- [HttpGet("{id:length(24)}")]
- public async Task> Get(string id)
- {
- var userNft = await _userNftService.GetAsync(id);
-
- if (userNft is null)
- {
- return NotFound();
- }
-
- return userNft;
- }
-
- [HttpPost]
- public async Task Post(UserNftCreateDto newUserNft)
- {
- var userId = HttpContext.Request.Headers["userId"].ToString();
- var existingUserNft = await _userNftService.GetUserNftByUserIdAndNftId(userId, newUserNft.nftId!);
-
- if (existingUserNft != null)
- {
- return Conflict("User already owns this NFT");
- }
-
- var userNft = new UserNft {
- userId = userId,
- nftId = newUserNft.nftId!
- };
- await _userNftService.CreateAsync(userNft);
-
- return CreatedAtAction(nameof(Get), new { id = userNft.userNftId }, userNft);
- }
-
- [HttpPatch("{id:length(24)}")]
- public async Task Update(string id, UserNft updatedUserNft)
- {
- var userNft = await _userNftService.GetAsync(id);
-
- if (userNft is null)
- {
- return NotFound();
- }
-
- updatedUserNft.userNftId = userNft.userNftId;
-
- await _userNftService.UpdateAsync(id, updatedUserNft);
-
- return NoContent();
- }
-
- [HttpDelete("{id:length(24)}")]
- public async Task Delete(string id)
- {
- var userNft = await _userNftService.GetAsync(id);
-
- if (userNft is null)
- {
- return NotFound();
- }
-
- await _userNftService.RemoveAsync(id);
-
- return NoContent();
- }
-
- [HttpGet("get-by-userid")]
- public async Task> GetByUserId(string userId) =>
- await _userNftService.GetUserNftByUserId(userId);
-
-
- [HttpGet("get-by-nftid")]
- public async Task> GetByNftId([FromQuery] string nftId) {
- var userNft = await _userNftService.GetUserNftByNftId(nftId);
- if (userNft is null)
- {
- return NotFound();
- }
- return userNft;
- }
-
- [HttpGet("get-by-userid-nftid")]
- public async Task> GetByUserIdNftId([FromQuery] string userId, [FromQuery] string nftId) {
- var userNft = await _userNftService.GetUserNftByUserIdAndNftId(userId, nftId);
- if (userNft is null)
- {
- return NotFound();
- }
- return userNft;
- }
-
-}
\ No newline at end of file
diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 0000000..39e2711
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,32 @@
+# dotnet 6 web api dockerfile
+
+# Build stage for MarketPlaceApi
+FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
+WORKDIR /app
+
+# Copy the entire solution
+COPY . .
+
+# Build the application
+WORKDIR "/app/MarketPlaceApi"
+RUN dotnet build "BookStoreApi.csproj" -c Release -o /app/build
+
+# Test stage
+FROM build AS test
+WORKDIR /app/MarketPlaceApi.Tests
+RUN dotnet test "MarketPlaceApi.Tests.csproj" --logger:trx
+
+# Publish stage for MarketPlaceApi
+FROM build AS publish
+WORKDIR /app/MarketPlaceApi
+RUN dotnet publish "BookStoreApi.csproj" -c Release -o /app/publish
+
+# Final stage
+FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS final
+WORKDIR /app
+
+# Copy published files from MarketPlaceApi
+COPY --from=publish /app/publish .
+
+# Set the entry point for the application
+ENTRYPOINT ["dotnet", "BookStoreApi.dll"]
diff --git a/Helpers/DatabaseConfig.cs b/Helpers/DatabaseConfig.cs
deleted file mode 100644
index 84dd237..0000000
--- a/Helpers/DatabaseConfig.cs
+++ /dev/null
@@ -1,16 +0,0 @@
-using System;
-
-public class DatabaseConfig
-{
- public string ConnectionString { get; }
-
- public DatabaseConfig()
- {
- // Retrieve the database password from the environment variables.
- string dbPassword = Environment.GetEnvironmentVariable("JiTIjugHfVMJzsEo") ?? throw new Exception("DB_PASSWORD environment variable not found.");
-
- // Use the retrieved password to build the connection string or perform other configurations.
- // For example:
- ConnectionString = $"mongodb+srv://folathecoder:JiTIjugHfVMJzsEo@crowdlaunchcluster.veylgng.mongodb.net/?retryWrites=true&w=majority";
- }
-}
diff --git a/Interfaces/IAuthService.cs b/Interfaces/IAuthService.cs
deleted file mode 100644
index 5f0fcf7..0000000
--- a/Interfaces/IAuthService.cs
+++ /dev/null
@@ -1,10 +0,0 @@
-using MARKETPLACEAPI.dto;
-using MARKETPLACEAPI.Models;
-namespace MARKETPLACEAPI.Interfaces;
-
-
-public interface IAuthService {
- string GenerateToken(User user);
- Task Authenticate(LoginDto loginDto);
- string DecodeToken(string token);
-}
\ No newline at end of file
diff --git a/Interfaces/IDefaultService.cs b/Interfaces/IDefaultService.cs
deleted file mode 100644
index 21baa92..0000000
--- a/Interfaces/IDefaultService.cs
+++ /dev/null
@@ -1,10 +0,0 @@
-namespace MARKETPLACEAPI.Interfaces;
-
-
-public interface IDefaultService {
- Task> GetAsync();
- Task GetAsync(string id);
- Task CreateAsync(T t);
- Task UpdateAsync(string id, T updatedT);
- Task RemoveAsync(string id);
-}
\ No newline at end of file
diff --git a/Interfaces/INftLikeService.cs b/Interfaces/INftLikeService.cs
deleted file mode 100644
index 93a7ee7..0000000
--- a/Interfaces/INftLikeService.cs
+++ /dev/null
@@ -1,9 +0,0 @@
-using MARKETPLACEAPI.Models;
-namespace MARKETPLACEAPI.Interfaces;
-
-
-public interface INftLikeService : IDefaultService {
- Task GetNftLikeByNftId(string nftId);
- Task> GetNftLikesByUserId(string userId);
- Task GetNftLikeByUserIdAndNftId(string userId, string nftId);
-}
\ No newline at end of file
diff --git a/Interfaces/INftService.cs b/Interfaces/INftService.cs
deleted file mode 100644
index 017a5db..0000000
--- a/Interfaces/INftService.cs
+++ /dev/null
@@ -1,12 +0,0 @@
-using MARKETPLACEAPI.Models;
-namespace MARKETPLACEAPI.Interfaces;
-
-
-public interface INftService : IDefaultService {
- Task> GetNftsByCreatorId(string creatorId);
- Task> GetNftsByOwnerId(string ownerId);
- Task GetNftByUserIdAndNftId(string userId, string nftId);
-
- Task> GetNftWithPriceFilter(double? priceMax, double? priceMin, bool? ascending = true);
- Task> SearchByNftName(string nftName, bool? ascending = true);
-}
\ No newline at end of file
diff --git a/Interfaces/IPortfolioService.cs b/Interfaces/IPortfolioService.cs
deleted file mode 100644
index bbf9422..0000000
--- a/Interfaces/IPortfolioService.cs
+++ /dev/null
@@ -1,14 +0,0 @@
-using MARKETPLACEAPI.Models;
-namespace MARKETPLACEAPI.Interfaces;
-
-
-public interface IPortfolioService : IDefaultService {
- Task> GetPortfolioByUserId(string userId);
-
- Task GetPortfolioByProjectId(string projectId);
-
- Task> GetPortfoliosByProjectId(string projectId);
-
- Task GetPortfolioByUserIdAndProjectId(string userId, string projectId);
-
-}
\ No newline at end of file
diff --git a/Interfaces/IProjectDetailService.cs b/Interfaces/IProjectDetailService.cs
deleted file mode 100644
index 92188cf..0000000
--- a/Interfaces/IProjectDetailService.cs
+++ /dev/null
@@ -1,7 +0,0 @@
-using MARKETPLACEAPI.Models;
-namespace MARKETPLACEAPI.Interfaces;
-
-
-public interface IProjectDetailService : IDefaultService {
- Task GetProjectDetailsByProjectId(string projectId);
-}
diff --git a/Interfaces/IProjectLikeService.cs b/Interfaces/IProjectLikeService.cs
deleted file mode 100644
index caf59c3..0000000
--- a/Interfaces/IProjectLikeService.cs
+++ /dev/null
@@ -1,9 +0,0 @@
-using MARKETPLACEAPI.Models;
-namespace MARKETPLACEAPI.Interfaces;
-
-
-public interface IProjectLikeService : IDefaultService {
- Task> GetProjectLikeByProjectId(string projectId);
- Task> GetProjectLikesByUserId(string userId);
- Task GetProjectLikeByUserIdAndProjectId(string userId, string projectId);
-}
\ No newline at end of file
diff --git a/Interfaces/IProjectUpdateService.cs b/Interfaces/IProjectUpdateService.cs
deleted file mode 100644
index a4ff451..0000000
--- a/Interfaces/IProjectUpdateService.cs
+++ /dev/null
@@ -1,8 +0,0 @@
-using MARKETPLACEAPI.Models;
-namespace MARKETPLACEAPI.Interfaces;
-
-
-public interface IProjectUpdateService : IDefaultService {
- Task> GetProjectUpdatesByProjectId(string projectId);
-}
-
diff --git a/Interfaces/IUserNftService.cs b/Interfaces/IUserNftService.cs
deleted file mode 100644
index 3b6a42d..0000000
--- a/Interfaces/IUserNftService.cs
+++ /dev/null
@@ -1,10 +0,0 @@
-using MARKETPLACEAPI.Models;
-namespace MARKETPLACEAPI.Interfaces;
-
-
-public interface IUserNftService : IDefaultService {
- Task GetUserNftByNftId(string nftId);
- Task> GetUserNftByUserId(string userId);
- Task GetUserNftByUserIdAndNftId(string userId, string nftId);
-}
-
diff --git a/Interfaces/IUserService.cs b/Interfaces/IUserService.cs
deleted file mode 100644
index 67f10bf..0000000
--- a/Interfaces/IUserService.cs
+++ /dev/null
@@ -1,8 +0,0 @@
-using MARKETPLACEAPI.Models;
-namespace MARKETPLACEAPI.Interfaces;
-
-
-public interface IUserService : IDefaultService {
- Task GetUserByWalletAddress(string walletAddress);
- Task UserExists(string walletAddress);
-}
diff --git a/Interfaces/IprojectService.cs b/Interfaces/IprojectService.cs
deleted file mode 100644
index 53ef291..0000000
--- a/Interfaces/IprojectService.cs
+++ /dev/null
@@ -1,16 +0,0 @@
-using MARKETPLACEAPI.Models;
-namespace MARKETPLACEAPI.Interfaces;
-
-
-public interface IProjectService : IDefaultService {
- Task GetProjectByWalletAddress(string walletAddress);
-
- Task> GetProjectsByUserId(string userId);
- Task> SearchByProjectName(string projectName, bool? ascending = true);
-
- Task> GetProjectWithFilters(string? search, bool? newest, bool? trending, Status? active,
- bool? mostLiked, List categoryIds, double? minInvestmentMin, double? minIvestmentMax, bool? minInvestmentAsc,
- double? amountRaisedMin, double? amountRaisedMax, bool? amountRaisedAsc, double? targetAmountMin,
- double? targetAmountMax, bool? targetAmountAsc,
- int? noOfDaysLeftMin, int? noOfDaysLeftMax, bool? noOfDaysLeftAsc, bool? ascending = true);
-}
diff --git a/MarketPlaceApi b/MarketPlaceApi
new file mode 160000
index 0000000..3e1ff5d
--- /dev/null
+++ b/MarketPlaceApi
@@ -0,0 +1 @@
+Subproject commit 3e1ff5d5ae22fed4334c79f1baa6cdf89ecfcc34
diff --git a/.env b/MarketPlaceApi.Tests/.env
similarity index 63%
rename from .env
rename to MarketPlaceApi.Tests/.env
index 6fd240a..b353654 100644
--- a/.env
+++ b/MarketPlaceApi.Tests/.env
@@ -1,2 +1,2 @@
-DB_PASSWORD=JiTIjugHfVMJzsEo
+DB_PASSWORD=iBpY5H8w8M4MzBP
JWT_KEY=Thisisaverylongkey2432fgnfnd5ytrjgrg544gns
\ No newline at end of file
diff --git a/MarketPlaceApi.Tests/.vscode/launch.json b/MarketPlaceApi.Tests/.vscode/launch.json
new file mode 100644
index 0000000..b02a196
--- /dev/null
+++ b/MarketPlaceApi.Tests/.vscode/launch.json
@@ -0,0 +1,26 @@
+{
+ "version": "0.2.0",
+ "configurations": [
+ {
+ // Use IntelliSense to find out which attributes exist for C# debugging
+ // Use hover for the description of the existing attributes
+ // For further information visit https://github.com/OmniSharp/omnisharp-vscode/blob/master/debugger-launchjson.md
+ "name": ".NET Core Launch (console)",
+ "type": "coreclr",
+ "request": "launch",
+ "preLaunchTask": "build",
+ // If you have changed target frameworks, make sure to update the program path.
+ "program": "${workspaceFolder}/bin/Debug/net6.0/MarketPlaceApi.Tests.dll",
+ "args": [],
+ "cwd": "${workspaceFolder}",
+ // For more information about the 'console' field, see https://aka.ms/VSCode-CS-LaunchJson-Console
+ "console": "internalConsole",
+ "stopAtEntry": false
+ },
+ {
+ "name": ".NET Core Attach",
+ "type": "coreclr",
+ "request": "attach"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/.vscode/tasks.json b/MarketPlaceApi.Tests/.vscode/tasks.json
similarity index 81%
rename from .vscode/tasks.json
rename to MarketPlaceApi.Tests/.vscode/tasks.json
index 2a27207..177782f 100644
--- a/.vscode/tasks.json
+++ b/MarketPlaceApi.Tests/.vscode/tasks.json
@@ -7,7 +7,7 @@
"type": "process",
"args": [
"build",
- "${workspaceFolder}/crowdlaunch-backend.csproj",
+ "${workspaceFolder}/MarketPlaceApi.Tests.csproj",
"/property:GenerateFullPaths=true",
"/consoleloggerparameters:NoSummary"
],
@@ -19,7 +19,7 @@
"type": "process",
"args": [
"publish",
- "${workspaceFolder}/crowdlaunch-backend.csproj",
+ "${workspaceFolder}/MarketPlaceApi.Tests.csproj",
"/property:GenerateFullPaths=true",
"/consoleloggerparameters:NoSummary"
],
@@ -33,7 +33,7 @@
"watch",
"run",
"--project",
- "${workspaceFolder}/crowdlaunch-backend.csproj"
+ "${workspaceFolder}/MarketPlaceApi.Tests.csproj"
],
"problemMatcher": "$msCompile"
}
diff --git a/MarketPlaceApi.Tests/Controllers/CategoryControllerTest.cs b/MarketPlaceApi.Tests/Controllers/CategoryControllerTest.cs
new file mode 100644
index 0000000..13f2aaa
--- /dev/null
+++ b/MarketPlaceApi.Tests/Controllers/CategoryControllerTest.cs
@@ -0,0 +1,120 @@
+namespace MARKETPLACEAPI.Tests.Controllers;
+
+public class CategoryControllerTests
+{
+
+ private readonly IDefaultService _mockCategoryService;
+ private readonly IMapper _mapper;
+ public CategoryControllerTests()
+ {
+ _mockCategoryService = A.Fake>();
+ _mapper = A.Fake();
+ }
+
+ [Fact]
+ public async Task GetCategories_ReturnsOkResult()
+ {
+ //Arrange
+ var categories = A.Fake>();
+ A.CallTo(() => _mockCategoryService.GetAsync()).Returns(Task.FromResult(categories));
+ var controller = new CategoryController(_mockCategoryService, _mapper);
+
+ //Act
+ var result = await controller.Get();
+
+ //Assert
+ result.Should().NotBeNull();
+ result.Should().BeOfType();
+ var okResult = result.Should().BeOfType().Subject;
+ okResult.StatusCode.Should().Be(200);
+ okResult.Value.Should().Be(categories);
+
+
+ }
+
+ [Fact]
+ public async Task GetCategoryById_ReturnsOkResult()
+ {
+ //Arrange
+ var category = A.Fake();
+ A.CallTo(() => _mockCategoryService.GetAsync("1")).Returns(Task.FromResult(category));
+ var controller = new CategoryController(_mockCategoryService, _mapper);
+
+ //Act
+ var result = await controller.Get("1");
+
+ //Assert
+ result.Should().NotBeNull();
+ result.Should().BeOfType();
+ var okResult = result.Should().BeOfType().Subject;
+ okResult.StatusCode.Should().Be(200);
+ okResult.Value.Should().Be(category);
+
+ }
+
+ [Fact]
+ public async Task CreateCategory_ReturnsCreatedAtActionResult()
+ {
+ //Arrange
+ var categoryDto = A.Fake();
+ var category = _mapper.Map(categoryDto);
+ A.CallTo(() => _mockCategoryService.CreateAsync(category)).Returns(Task.FromResult(category));
+
+ var controller = new CategoryController(_mockCategoryService, _mapper);
+
+ //Act
+ var result = await controller.Post(categoryDto);
+ //Assert
+ result.Should().NotBeNull();
+ result.Should().BeOfType();
+ var okResult = result.Should().BeOfType().Subject;
+ okResult.StatusCode.Should().Be(201);
+
+ }
+
+ [Fact]
+ public async Task UpdateCategory_ReturnsNoContentResult()
+ {
+ //Arrange
+ var categoryDto = A.Fake();
+ var category = A.Fake();
+
+ var updatedCategory = _mapper.Map(categoryDto, category);
+ A.CallTo(() => _mockCategoryService.UpdateAsync(category.categoryId, updatedCategory)).Returns(Task.FromResult(category));
+
+ var controller = new CategoryController(_mockCategoryService, _mapper);
+
+ //Act
+ var result = await controller.Update(category.categoryId, categoryDto);
+
+
+ //Assert
+ result.Should().NotBeNull();
+ result.Should().BeOfType();
+ var okResult = result.Should().BeOfType().Subject;
+ okResult.StatusCode.Should().Be(204);
+
+ }
+
+ [Fact]
+ public async Task DeleteCategory_ReturnsOkResult()
+ {
+ //Arrange
+ var category = A.Fake();
+
+ A.CallTo(() => _mockCategoryService.RemoveAsync(category.categoryId)).Returns(Task.FromResult(category));
+ var controller = new CategoryController(_mockCategoryService, _mapper);
+
+ //Act
+ var result = await controller.Delete(category.categoryId);
+
+ //Assert
+ result.Should().NotBeNull();
+ result.Should().BeOfType();
+ var okResult = result.Should().BeOfType().Subject;
+ okResult.StatusCode.Should().Be(204);
+
+ }
+
+}
+
\ No newline at end of file
diff --git a/MarketPlaceApi.Tests/Controllers/NftControllerTest.cs b/MarketPlaceApi.Tests/Controllers/NftControllerTest.cs
new file mode 100644
index 0000000..79843b3
--- /dev/null
+++ b/MarketPlaceApi.Tests/Controllers/NftControllerTest.cs
@@ -0,0 +1,134 @@
+using Microsoft.AspNetCore.Http;
+
+namespace MARKETPLACEAPI.Tests.Controllers;
+
+
+public class NftControllerTest
+{
+ private readonly INftService _mockNftService;
+ private readonly IDefaultService _mockCategoryService;
+ private readonly IMapper _mapper;
+
+ public NftControllerTest()
+ {
+ _mockNftService = A.Fake();
+ _mockCategoryService = A.Fake>();
+ _mapper = A.Fake();
+ }
+
+ [Fact]
+ public async Task GetNfts_ReturnsOkResult()
+ {
+ //Arrange
+ var nfts = A.Fake>();
+
+ A.CallTo(() => _mockNftService.GetAsync()).Returns(Task.FromResult(nfts));
+ var controller = new NftController(_mockNftService, _mockCategoryService, _mapper);
+
+ //Act
+ var result = await controller.Get();
+
+ //Assert
+ result.Should().NotBeNull();
+ result.Should().BeOfType();
+ var okResult = result.Should().BeOfType().Subject;
+ okResult.StatusCode.Should().Be(200);
+ okResult.Value.Should().Be(nfts);
+ }
+
+ [Fact]
+ public async Task GetNftById_ReturnsOkResult()
+ {
+ //Arrange
+ var nft = A.Fake();
+ A.CallTo(() => _mockNftService.GetAsync("1")).Returns(Task.FromResult(nft));
+ var controller = new NftController(_mockNftService, _mockCategoryService, _mapper);
+
+ var nftDto = A.Fake();
+
+ nftDto.nft = nft;
+ nftDto.category = A.Fake();
+
+ //Act
+ var result = await controller.Get("1");
+
+ //Assert
+ result.Should().NotBeNull();
+ result.Should().BeOfType();
+ var okResult = result.Should().BeOfType().Subject;
+ okResult.StatusCode.Should().Be(200);
+ }
+
+ [Fact]
+ public async Task CreateNft_ReturnsCreatedAtActionResult()
+ {
+ //Arrange
+
+ var newNft = A.Fake();
+
+ var nft = _mapper.Map(newNft);
+ var userId = "1";
+
+
+ A.CallTo(() => _mockNftService.CreateAsync(nft)).Returns(Task.FromResult(nft));
+ var controller = new NftController(_mockNftService, _mockCategoryService, _mapper);
+
+ controller.ControllerContext.HttpContext = new DefaultHttpContext();
+ controller.ControllerContext.HttpContext.Items["User"] = userId;
+
+
+
+ //Act
+ var result = await controller.Post(newNft);
+
+ //Assert
+ result.Should().NotBeNull();
+ result.Should().BeOfType();
+ var createdResult = result.Should().BeOfType().Subject;
+ createdResult.StatusCode.Should().Be(201);
+ }
+
+ [Fact]
+ public async Task UpdateNft_ReturnsNoContentResult()
+ {
+ //Arrange
+ var nft = A.Fake();
+ var nftDto = A.Fake();
+ var userId = "1";
+
+
+ var nftUpdate = _mapper.Map(nftDto, nft);
+
+ A.CallTo(() => _mockNftService.UpdateAsync(nft.nftId, nftUpdate)).Returns(Task.FromResult(nftUpdate));
+ var controller = new NftController(_mockNftService, _mockCategoryService, _mapper);
+
+ //Act
+ var result = await controller.Update(nft.nftId, nftDto);
+
+ //Assert
+ result.Should().NotBeNull();
+ result.Should().BeOfType();
+ var noContentResult = result.Should().BeOfType().Subject;
+ noContentResult.StatusCode.Should().Be(204);
+
+ }
+
+ [Fact]
+ public async Task DeleteNft_ReturnsNoContentResult()
+ {
+ //Arrange
+ var nft = A.Fake();
+ A.CallTo(() => _mockNftService.RemoveAsync(nft.nftId)).Returns(Task.FromResult(nft));
+ var controller = new NftController(_mockNftService, _mockCategoryService, _mapper);
+
+ //Act
+ var result = await controller.Delete(nft.nftId);
+
+ //Assert
+ result.Should().NotBeNull();
+ result.Should().BeOfType();
+ var noContentResult = result.Should().BeOfType().Subject;
+ noContentResult.StatusCode.Should().Be(204);
+ }
+
+}
\ No newline at end of file
diff --git a/MarketPlaceApi.Tests/Controllers/NftLikeControllerTest.cs b/MarketPlaceApi.Tests/Controllers/NftLikeControllerTest.cs
new file mode 100644
index 0000000..4485896
--- /dev/null
+++ b/MarketPlaceApi.Tests/Controllers/NftLikeControllerTest.cs
@@ -0,0 +1,177 @@
+using Microsoft.AspNetCore.Http;
+
+namespace MARKETPLACEAPI.Tests.Controllers;
+
+public class NftLikeControllerTest
+{
+ private readonly INftLikeService _mockNftLikeService;
+ private readonly INftService _mockNftService;
+ private readonly IMapper _mapper;
+
+ public NftLikeControllerTest()
+ {
+ _mockNftLikeService = A.Fake();
+ _mockNftService = A.Fake();
+ _mapper = A.Fake();
+ }
+
+ [Fact]
+ public async Task GetNftLikes_ReturnsOkResult()
+ {
+ //Arrange
+ var nftLikes = A.Fake>();
+ A.CallTo(() => _mockNftLikeService.GetAsync()).Returns(Task.FromResult(nftLikes));
+ var controller = new NftLikeController(_mockNftLikeService, _mockNftService, _mapper);
+
+ //Act
+ var result = await controller.Get();
+
+ //Assert
+ result.Should().NotBeNull();
+ result.Should().BeOfType();
+ var okResult = result.Should().BeOfType().Subject;
+ okResult.StatusCode.Should().Be(200);
+ okResult.Value.Should().Be(nftLikes);
+ }
+
+ [Fact]
+ public async Task GetNftLikeById_ReturnsOkResult()
+ {
+ //Arrange
+ var nftLike = A.Fake();
+ A.CallTo(() => _mockNftLikeService.GetAsync("1")).Returns(Task.FromResult(nftLike));
+ var controller = new NftLikeController(_mockNftLikeService, _mockNftService, _mapper);
+
+ //Act
+ var result = await controller.Get("1");
+
+ //Assert
+ result.Should().NotBeNull();
+ result.Should().BeOfType();
+ var okResult = result.Should().BeOfType().Subject;
+ okResult.StatusCode.Should().Be(200);
+ okResult.Value.Should().Be(nftLike);
+ }
+
+
+
+ [Fact]
+ public async Task PostNftLike_ReturnsCreatedAtActionResult()
+ {
+ // Arrange
+ var nftLikeDto = new NftLikeCreateDto
+ {
+ nftId = "1"
+ };
+ var nftLike = _mapper.Map(nftLikeDto);
+
+ // Mock the _nftService.GetAsync method to return a valid nft object
+ A.CallTo(() => _mockNftService.GetAsync(nftLike.nftId)).Returns(Task.FromResult(A.Fake()));
+
+ // Mock the _nftLikeService.GetNftLikeByUserIdAndNftId to return null
+ A.CallTo(() => _mockNftLikeService.GetNftLikeByUserIdAndNftId("1", "1")).Returns(Task.FromResult((NftLike)null));
+
+ // Set up the HttpContext with the required header
+ var httpContext = new DefaultHttpContext();
+ httpContext.Request.Headers["userId"] = "1";
+
+ var controller = new NftLikeController(_mockNftLikeService, _mockNftService, _mapper)
+ {
+ ControllerContext = new ControllerContext
+ {
+ HttpContext = httpContext
+ }
+ };
+
+ // Act
+ var result = await controller.Post(nftLikeDto);
+
+ // Assert
+ result.Should().NotBeNull();
+ result.Should().BeOfType();
+ var createdAtResult = result.Should().BeOfType().Subject;
+ createdAtResult.StatusCode.Should().Be(201);
+
+ }
+
+ [Fact]
+ public async Task UpdateNftLike_ReturnsNoContentResult()
+ {
+ //Arrange
+ var nftLike = A.Fake();
+ A.CallTo(() => _mockNftLikeService.UpdateAsync(nftLike.nftId, nftLike)).Returns(Task.FromResult(nftLike));
+ var controller = new NftLikeController(_mockNftLikeService, _mockNftService, _mapper);
+
+ //Act
+ var result = await controller.Update("1", nftLike);
+
+ //Assert
+ result.Should().NotBeNull();
+ result.Should().BeOfType();
+ var okResult = result.Should().BeOfType().Subject;
+ okResult.StatusCode.Should().Be(204);
+ }
+
+ [Fact]
+ public async Task DeleteNftLike_ReturnsNoContentResult()
+ {
+ //Arrange
+ var nftLike = A.Fake();
+ A.CallTo(() => _mockNftLikeService.GetAsync("1")).Returns(Task.FromResult(nftLike));
+ A.CallTo(() => _mockNftLikeService.RemoveAsync(nftLike.nftId)).Returns(Task.FromResult(nftLike));
+ var controller = new NftLikeController(_mockNftLikeService, _mockNftService, _mapper);
+ controller.ControllerContext.HttpContext = new DefaultHttpContext();
+ controller.ControllerContext.HttpContext.Request.Headers["userId"] = "2";
+ //Act
+ var result = await controller.Delete(nftLike.nftId);
+
+ //Assert
+ result.Should().NotBeNull();
+ result.Should().BeOfType();
+ var okResult = result.Should().BeOfType().Subject;
+ okResult.StatusCode.Should().Be(204);
+ }
+
+ [Fact]
+ public async Task GetNftLikesByUserId_ReturnsOkResult()
+ {
+ //Arrange
+ var nftLikes = A.Fake>();
+ A.CallTo(() => _mockNftLikeService.GetNftLikesByUserId("1")).Returns(Task.FromResult(nftLikes));
+
+ var controller = new NftLikeController(_mockNftLikeService, _mockNftService, _mapper);
+
+
+ //Act
+ var result = await controller.GetNftLikesByUserId("1");
+
+ //Assert
+ result.Should().NotBeNull();
+ result.Should().BeOfType();
+ var okResult = result.Should().BeOfType().Subject;
+ okResult.StatusCode.Should().Be(200);
+ okResult.Value.Should().Be(nftLikes);
+ }
+
+
+ [Fact]
+ public async Task GetNftLikesByUserAndNftId_ReturnsOkResult()
+ {
+ //Arrange
+ var nftLike = A.Fake();
+ A.CallTo(() => _mockNftLikeService.GetNftLikeByUserIdAndNftId("1", "1")).Returns(Task.FromResult(nftLike));
+
+ var controller = new NftLikeController(_mockNftLikeService, _mockNftService, _mapper);
+
+ //Act
+ var result = await controller.GetNftLikeByUserIdAndNftId("1", "1");
+
+ //Assert
+ result.Should().NotBeNull();
+ result.Should().BeOfType();
+ var okResult = result.Should().BeOfType().Subject;
+ okResult.StatusCode.Should().Be(200);
+ okResult.Value.Should().Be(nftLike);
+
+ }
+}
\ No newline at end of file
diff --git a/MarketPlaceApi.Tests/Controllers/PortfolioControllerTest.cs b/MarketPlaceApi.Tests/Controllers/PortfolioControllerTest.cs
new file mode 100644
index 0000000..26fce51
--- /dev/null
+++ b/MarketPlaceApi.Tests/Controllers/PortfolioControllerTest.cs
@@ -0,0 +1,168 @@
+using Microsoft.AspNetCore.Http;
+
+namespace MARKETPLACEAPI.Tests.Controllers;
+
+
+public class PortfolioControllerTest
+{
+ private readonly IPortfolioService _mockPortfolioService;
+ private readonly IProjectService _mockProjectService;
+ private readonly IMapper _mapper;
+
+ public PortfolioControllerTest()
+ {
+ _mockPortfolioService = A.Fake();
+ _mockProjectService = A.Fake();
+ _mapper = A.Fake();
+ }
+
+ [Fact]
+ public async Task GetPortfolios_ReturnsOkResult()
+ {
+ //Arrange
+ var portfolios = A.Fake>();
+
+ A.CallTo(() => _mockPortfolioService.GetAsync()).Returns(Task.FromResult(portfolios));
+ var controller = new PortfolioController(_mockPortfolioService, _mockProjectService, _mapper);
+
+ //Act
+ var result = await controller.Get();
+
+ //Assert
+ result.Should().NotBeNull();
+ result.Should().BeOfType();
+ var okResult = result.Should().BeOfType().Subject;
+ okResult.StatusCode.Should().Be(200);
+ okResult.Value.Should().Be(portfolios);
+ }
+
+ [Fact]
+ public async Task GetPortfolioById_ReturnsOkResult()
+ {
+ //Arrange
+ var portfolio = A.Fake();
+ A.CallTo(() => _mockPortfolioService.GetAsync("1")).Returns(Task.FromResult(portfolio));
+ var controller = new PortfolioController(_mockPortfolioService, _mockProjectService, _mapper);
+
+
+ //Act
+ var result = await controller.Get("1");
+
+ //Assert
+ result.Should().NotBeNull();
+ result.Should().BeOfType();
+ var okResult = result.Should().BeOfType().Subject;
+ okResult.StatusCode.Should().Be(200);
+ okResult.Value.Should().Be(portfolio);
+ }
+
+ [Fact]
+ public async Task CreatePortfolio_ReturnsCreatedAtActionResult()
+ {
+ //Arrange
+ var portfolioDto = new PortfolioCreateDto
+ {
+ projectId = "1",
+ status = 0,
+ amountInvested = 1000
+ };
+ var portfolio = A.Fake();
+ var userId = "1";
+
+ var newPortfolio = _mapper.Map(portfolioDto);
+
+ A.CallTo(() => _mockPortfolioService.CreateAsync(newPortfolio)).Returns(Task.FromResult(newPortfolio));
+ A.CallTo(() => _mockPortfolioService.GetPortfolioByUserIdAndProjectId(userId, portfolioDto.projectId)).Returns(Task.FromResult((Portfolio)null));
+ var controller = new PortfolioController(_mockPortfolioService, _mockProjectService, _mapper);
+ controller.ControllerContext.HttpContext = new DefaultHttpContext();
+ controller.ControllerContext.HttpContext.Request.Headers["userId"] = userId;
+
+
+ //Act
+ var result = await controller.Post(portfolioDto);
+
+ //Assert
+ result.Should().NotBeNull();
+ result.Should().BeOfType();
+ var createdResult = result.Should().BeOfType().Subject;
+ createdResult.StatusCode.Should().Be(201);
+ }
+
+
+ [Fact]
+ public async Task UpdatePortfolio_ReturnsNoContentResult()
+ {
+ //Arrange
+ var portfolio = A.Fake();
+ A.CallTo(() => _mockPortfolioService.UpdateAsync(portfolio.portfolioId, portfolio)).Returns(Task.FromResult(portfolio));
+ var controller = new PortfolioController(_mockPortfolioService, _mockProjectService, _mapper);
+
+ //Act
+ var result = await controller.Update(portfolio.portfolioId, portfolio);
+
+ //Assert
+ result.Should().NotBeNull();
+ result.Should().BeOfType();
+ var noContentResult = result.Should().BeOfType().Subject;
+ noContentResult.StatusCode.Should().Be(204);
+ }
+
+ [Fact]
+ public async Task DeletePortfolio_ReturnsNoContentResult()
+ {
+ //Arrange
+ var portfolio = A.Fake();
+ A.CallTo(() => _mockPortfolioService.RemoveAsync(portfolio.portfolioId)).Returns(Task.FromResult(portfolio));
+ var controller = new PortfolioController(_mockPortfolioService, _mockProjectService, _mapper);
+
+ //Act
+ var result = await controller.Delete(portfolio.portfolioId);
+
+ //Assert
+ result.Should().NotBeNull();
+ result.Should().BeOfType();
+ var noContentResult = result.Should().BeOfType().Subject;
+ noContentResult.StatusCode.Should().Be(204);
+ }
+
+ [Fact]
+ public async Task GetPortfolioByUserId_ReturnsOkResult()
+ {
+ //Arrange
+ var portfolio = A.Fake>();
+
+ A.CallTo(() => _mockPortfolioService.GetPortfolioByUserId("1")).Returns(Task.FromResult(portfolio));
+ var controller = new PortfolioController(_mockPortfolioService, _mockProjectService, _mapper);
+
+ //Act
+ var result = await controller.GetPortfolioByUserId("1");
+
+ //Assert
+ result.Should().NotBeNull();
+ result.Should().BeOfType();
+ var okResult = result.Should().BeOfType().Subject;
+ okResult.StatusCode.Should().Be(200);
+ okResult.Value.Should().Be(portfolio);
+
+ }
+
+ [Fact]
+ public async Task GetPortfolioByProjectId_ReturnsOkResult()
+ {
+ //Arrange
+ var portfolio = A.Fake();
+ A.CallTo(() => _mockPortfolioService.GetPortfolioByProjectId("1")).Returns(Task.FromResult(portfolio));
+ var controller = new PortfolioController(_mockPortfolioService, _mockProjectService, _mapper);
+
+
+ //Act
+ var result = await controller.GetPortfolioByProjectId("1");
+
+ //Assert
+ result.Should().NotBeNull();
+ result.Should().BeOfType();
+ var okResult = result.Should().BeOfType().Subject;
+ okResult.StatusCode.Should().Be(200);
+ okResult.Value.Should().Be(portfolio);
+ }
+}
\ No newline at end of file
diff --git a/MarketPlaceApi.Tests/Controllers/ProjectControllerTest.cs b/MarketPlaceApi.Tests/Controllers/ProjectControllerTest.cs
new file mode 100644
index 0000000..f6b521f
--- /dev/null
+++ b/MarketPlaceApi.Tests/Controllers/ProjectControllerTest.cs
@@ -0,0 +1,267 @@
+using Microsoft.AspNetCore.Http;
+
+namespace MARKETPLACEAPI.Tests.Controllers;
+
+
+public class ProjectControllerTest
+{
+ private readonly IProjectService _mockProjectService;
+ private readonly IProjectUpdateService _mockProjectUpdateService;
+ private readonly IProjectDetailService _mockProjectDetailService;
+ private readonly IDefaultService _mockCategoryService;
+ private readonly IMapper _mapper;
+
+ public ProjectControllerTest()
+ {
+ _mockProjectService = A.Fake();
+ _mockProjectUpdateService = A.Fake();
+ _mockProjectDetailService = A.Fake();
+ _mockCategoryService = A.Fake>();
+ _mapper = A.Fake();
+ }
+
+ [Fact]
+ public async Task GetProjects_ReturnsOkResult()
+ {
+ //Arrange
+ var projects = A.Fake>();
+
+ A.CallTo(() => _mockProjectService.GetAsync()).Returns(Task.FromResult(projects));
+ var controller = new ProjectController(_mockProjectService, _mockProjectUpdateService, _mockProjectDetailService, _mockCategoryService, _mapper);
+
+ //Act
+ var result = await controller.Get();
+
+ //Assert
+ result.Should().NotBeNull();
+ result.Should().BeOfType();
+ var okResult = result.Should().BeOfType().Subject;
+ okResult.StatusCode.Should().Be(200);
+ okResult.Value.Should().Be(projects);
+ }
+
+ [Fact]
+ public async Task GetProjectById_ReturnsOkResult()
+ {
+ //Arrange
+ var project = A.Fake();
+ A.CallTo(() => _mockProjectService.GetAsync("1")).Returns(Task.FromResult(project));
+ var controller = new ProjectController(_mockProjectService, _mockProjectUpdateService, _mockProjectDetailService, _mockCategoryService, _mapper);
+
+
+ //Act
+ var result = await controller.Get("1");
+
+ //Assert
+ result.Should().NotBeNull();
+ result.Should().BeOfType();
+ var okResult = result.Should().BeOfType().Subject;
+ okResult.StatusCode.Should().Be(200);
+ // okResult.Value.Should().Be(projectDto);
+ }
+
+ [Fact]
+ public async Task CreateProject_ReturnsCreatedAtActionResult()
+ {
+ //Arrange
+
+ var projectDto = new ProjectCreateDto
+ {
+ categoryId = "1",
+ projectName = "Test",
+ bannerImageUrl = "Test",
+ targetAmount = 1000,
+ minInvestment = 100,
+ noOfDaysLeft = 10,
+ projectWalletAddress = "Test",
+ customColour = A.Fake(),
+ projectStatus = 0,
+ amountRaised = 0,
+ };
+ var userId = "1";
+
+
+ var newProject = _mapper.Map(projectDto);
+
+ A.CallTo(() => _mockProjectService.CreateAsync(newProject)).Returns(Task.FromResult(newProject));
+ A.CallTo(() => _mockProjectService.GetProjectByWalletAddress("Test")).Returns(Task.FromResult((Project)null));
+ var controller = new ProjectController(_mockProjectService, _mockProjectUpdateService, _mockProjectDetailService, _mockCategoryService, _mapper);
+ controller.ControllerContext.HttpContext = new DefaultHttpContext();
+ controller.ControllerContext.HttpContext.Request.Headers["userId"] = userId;
+
+ //Act
+ var result = await controller.Post(projectDto);
+
+ //Assert
+ result.Should().NotBeNull();
+ result.Should().BeOfType();
+ var createdAtActionResult = result.Should().BeOfType().Subject;
+ createdAtActionResult.StatusCode.Should().Be(201);
+ }
+
+ [Fact]
+ public async Task UpdateProject_ReturnsNoContent()
+ {
+ //Arrange
+ var projectDto = A.Fake();
+ var project = A.Fake();
+
+ var updatedProject = _mapper.Map(projectDto, project);
+
+ A.CallTo(() => _mockProjectService.UpdateAsync(project.projectId, updatedProject)).Returns(Task.FromResult(updatedProject));
+ var controller = new ProjectController(_mockProjectService, _mockProjectUpdateService, _mockProjectDetailService, _mockCategoryService, _mapper);
+
+ //Act
+ var result = await controller.Update("1", projectDto);
+
+ //Assert
+ result.Should().NotBeNull();
+ result.Should().BeOfType();
+ var okResult = result.Should().BeOfType().Subject;
+ okResult.StatusCode.Should().Be(204);
+ }
+
+ [Fact]
+ public async Task DeleteProject_ReturnsNoContent()
+ {
+ //Arrange
+ var project = A.Fake();
+
+ A.CallTo(() => _mockProjectService.RemoveAsync("1")).Returns(Task.FromResult(project));
+ var controller = new ProjectController(_mockProjectService, _mockProjectUpdateService, _mockProjectDetailService, _mockCategoryService, _mapper);
+
+ //Act
+ var result = await controller.Delete("1");
+
+ //Assert
+ result.Should().NotBeNull();
+ result.Should().BeOfType();
+ var okResult = result.Should().BeOfType().Subject;
+ okResult.StatusCode.Should().Be(204);
+ }
+
+ [Fact]
+ public async Task GetProjectsByUserId_ReturnsOkResult()
+ {
+ //Arrange
+ var projects = A.Fake>();
+
+ A.CallTo(() => _mockProjectService.GetProjectsByUserId("1")).Returns(Task.FromResult(projects));
+ var controller = new ProjectController(_mockProjectService, _mockProjectUpdateService, _mockProjectDetailService, _mockCategoryService, _mapper);
+
+ //Act
+ var result = await controller.GetProjectsByUserId("1");
+
+ //Assert
+ result.Should().NotBeNull();
+ result.Should().BeOfType();
+ var okResult = result.Should().BeOfType().Subject;
+ okResult.StatusCode.Should().Be(200);
+ okResult.Value.Should().Be(projects);
+ }
+
+ [Fact]
+ public async Task SearchProjects_ReturnsOkResult()
+ {
+ //Arrange
+ var projects = A.Fake>();
+
+ A.CallTo(() => _mockProjectService.SearchByProjectName("1", true)).Returns(Task.FromResult(projects));
+
+ var controller = new ProjectController(_mockProjectService, _mockProjectUpdateService, _mockProjectDetailService, _mockCategoryService, _mapper);
+
+ //Act
+ var result = await controller.SearchProjects("1", true);
+
+ //Assert
+ result.Should().NotBeNull();
+ result.Should().BeOfType();
+ var okResult = result.Should().BeOfType().Subject;
+ okResult.StatusCode.Should().Be(200);
+ okResult.Value.Should().Be(projects);
+ }
+
+ [Fact]
+ public async Task GetProjectByWalletAddress_ReturnsOkResult()
+ {
+ //Arrange
+ var project = A.Fake();
+
+ A.CallTo(() => _mockProjectService.GetProjectByWalletAddress("1")).Returns(Task.FromResult(project));
+
+ var controller = new ProjectController(_mockProjectService, _mockProjectUpdateService, _mockProjectDetailService, _mockCategoryService, _mapper);
+
+ //Act
+ var result = await controller.GetProjectByWalletAddress("1");
+
+ //Assert
+ result.Should().NotBeNull();
+ result.Should().BeOfType();
+ var okResult = result.Should().BeOfType().Subject;
+ okResult.StatusCode.Should().Be(200);
+ }
+
+ [Fact]
+ public async Task GetProjectWithFilters_ReturnsOkResult()
+ {
+ //Arrange
+ var projects = A.Fake>();
+ var categoryIds = new List { "1" };
+ var status = Status.Completed;
+
+ A.CallTo(() => _mockProjectService.GetProjectWithFilters(
+ "1",
+ false,
+ false,
+ 0,
+ false,
+ categoryIds,
+ 1,
+ 1,
+ false,
+ 1,
+ 1,
+ false,
+ 1,
+ 1,
+ false,
+ 1,
+ 1,
+ false,
+ false
+ )).Returns(Task.FromResult(projects));
+
+ var controller = new ProjectController(_mockProjectService, _mockProjectUpdateService, _mockProjectDetailService, _mockCategoryService, _mapper);
+
+ //Act
+ var result = await controller.GetProjectWithFilters(
+ "1",
+ false,
+ false,
+ 0,
+ false,
+ categoryIds,
+ 1,
+ 1,
+ false,
+ 1,
+ 1,
+ false,
+ 1,
+ 1,
+ false,
+ 1,
+ 1,
+ false,
+ false
+ );
+
+ //Assert
+ result.Should().NotBeNull();
+ result.Should().BeOfType();
+ var okResult = result.Should().BeOfType().Subject;
+ okResult.StatusCode.Should().Be(200);
+ okResult.Value.Should().Be(projects);
+
+ }
+}
\ No newline at end of file
diff --git a/MarketPlaceApi.Tests/Controllers/ProjectLikeControllerTest.cs b/MarketPlaceApi.Tests/Controllers/ProjectLikeControllerTest.cs
new file mode 100644
index 0000000..e7ab10e
--- /dev/null
+++ b/MarketPlaceApi.Tests/Controllers/ProjectLikeControllerTest.cs
@@ -0,0 +1,179 @@
+using Microsoft.AspNetCore.Http;
+
+namespace MARKETPLACEAPI.Tests.Controllers;
+
+
+public class ProjectLikeControllerTest
+{
+ private readonly IProjectLikeService _mockProjectLikeService;
+ private readonly IProjectService _mockProjectService;
+ private readonly IMapper _mapper;
+
+ public ProjectLikeControllerTest()
+ {
+ _mockProjectLikeService = A.Fake();
+ _mockProjectService = A.Fake();
+ _mapper = A.Fake();
+ }
+
+ [Fact]
+ public async Task GetProjectLikes ()
+ {
+ // Arrange
+ var projectLikeController = new ProjectLikeController(_mockProjectLikeService, _mockProjectService, _mapper);
+ var projectLikes = A.Fake>();
+
+ A.CallTo(() => _mockProjectLikeService.GetAsync()).Returns(Task.FromResult(projectLikes));
+
+ // Act
+
+ var result = await projectLikeController.Get();
+
+ // Assert
+ result.Should().NotBeNull();
+ result.Should().BeOfType();
+ var okResult = result.Should().BeOfType().Subject;
+ okResult.StatusCode.Should().Be(200);
+ okResult.Value.Should().Be(projectLikes);
+ }
+
+ [Fact]
+ public async Task GetProjectLikeById_ReturnsOkResult()
+ {
+ // Arrange
+ var projectLikeController = new ProjectLikeController(_mockProjectLikeService, _mockProjectService, _mapper);
+ var projectLike = A.Fake();
+ A.CallTo(() => _mockProjectLikeService.GetAsync("1")).Returns(Task.FromResult(projectLike));
+
+ // Act
+ var result = await projectLikeController.Get("1");
+
+ // Assert
+ result.Should().NotBeNull();
+ result.Should().BeOfType();
+ var okResult = result.Should().BeOfType().Subject;
+ okResult.StatusCode.Should().Be(200);
+ okResult.Value.Should().Be(projectLike);
+ }
+
+ [Fact]
+ public async Task PostProjectLike_ReturnsCreatedAtActionResult()
+ {
+ // Arrange
+ var projectLikeController = new ProjectLikeController(_mockProjectLikeService, _mockProjectService, _mapper);
+ projectLikeController.ControllerContext.HttpContext = new DefaultHttpContext();
+ projectLikeController.ControllerContext.HttpContext.Request.Headers["userId"] = "1";
+ var projectLikeDto = new ProjectLikeCreateDto
+ {
+ projectId = "1",
+ };
+ var projectLike = _mapper.Map(projectLikeDto);
+ A.CallTo(() => _mockProjectLikeService.GetProjectLikeByUserIdAndProjectId("1", "1")).Returns(Task.FromResult((ProjectLike)null));
+ A.CallTo(() => _mockProjectLikeService.CreateAsync(projectLike)).Returns(Task.FromResult(projectLike));
+
+ // Act
+ var result = await projectLikeController.Post(projectLikeDto);
+
+ // Assert
+ result.Should().NotBeNull();
+ result.Should().BeOfType();
+ var createdAtActionResult = result.Should().BeOfType