This commit is contained in:
Damien Ostler 2024-01-27 06:53:56 -05:00
parent 93198c680b
commit 1cba55bdb1
109 changed files with 9914 additions and 361 deletions

55
.github/workflows/build-image.yml vendored Normal file
View File

@ -0,0 +1,55 @@
name: build-image
on:
push:
branches: [main]
jobs:
build-image:
runs-on: [ubuntu-latest]
env:
DOTNET_INSTALL_DIR: "/home/runner"
permissions:
contents: write
packages: write
steps:
- name: 'Cleanup build folder'
run: |
rm ./* -r || true
rm ./.??* -r || true
- uses: actions/setup-dotnet@v3
with:
dotnet-version: 6.0.x
- name: Set up GitVersion
uses: gittools/actions/gitversion/setup@v0.9.15
with:
versionSpec: '5.x'
- name: Checkout code
uses: actions/checkout@v3
with:
fetch-depth: 0
- name: Execute GitVersion
uses: gittools/actions/gitversion/execute@v0.9.15
with:
useConfigFile: true
configFilePath: GitVersion.yml
- name: login into registry
run: echo "${{ secrets.GITHUB_TOKEN }}" | docker login https://ghcr.io -u $ --password-stdin
- name: Build image
env:
dockerfile: ./src/ArtPlatform.API/Dockerfile
docker_image_name: ghcr.io/damientehdemon/artplatform-api
run: |
docker build --build-arg NUGET_SOURCE=https://nuget.pkg.github.com/data443/index.json --build-arg NUGET_API_KEY=${{ secrets.PACKAGE_TOKEN }} -t ${{ env.docker_image_name }}:${{ env.GitVersion_MajorMinorPatch }} -f ${{ env.dockerfile }} --force-rm .
docker tag ${{ env.docker_image_name }}:${{ env.GitVersion_MajorMinorPatch }} ${{ env.docker_image_name }}:latest
docker push --all-tags ${{ env.docker_image_name }}
- name: Tag branch
run: |
git tag ${{ env.GitVersion_MajorMinorPatch }}
git push origin ${{ env.GitVersion_MajorMinorPatch }}

View File

@ -0,0 +1,210 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="AutoGeneratedRunConfigurationManager">
<projectFile profileName="http">ArtPlatform.API/ArtPlatform.API.csproj</projectFile>
<projectFile profileName="https">ArtPlatform.API/ArtPlatform.API.csproj</projectFile>
<projectFile>ArtPlatform.Database.Migrator/ArtPlatform.Database.Migrator.csproj</projectFile>
<projectFile profileName="http">ArtPlatform/ArtPlatform.csproj</projectFile>
<projectFile profileName="https">ArtPlatform/ArtPlatform.csproj</projectFile>
</component>
<component name="AutoImportSettings">
<option name="autoReloadType" value="SELECTIVE" />
</component>
<component name="ChangeListManager">
<list default="true" id="e251c08f-6fd2-4319-a6ec-5f03319157f3" name="Changes" comment="">
<change afterPath="$PROJECT_DIR$/../src/ArtPlatform.Database.Migrator/ArtPlatform.Database.Migrator.csproj" afterDir="false" />
<change afterPath="$PROJECT_DIR$/../src/ArtPlatform.Database.Migrator/Program.cs" afterDir="false" />
<change afterPath="$PROJECT_DIR$/../src/ArtPlatform.Database/ApplicationDbContext.cs" afterDir="false" />
<change afterPath="$PROJECT_DIR$/../src/ArtPlatform.Database/ArtPlatform.Database.csproj" afterDir="false" />
<change beforePath="$PROJECT_DIR$/../ArtPlatform/.dockerignore" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/../ArtPlatform/.idea/.idea.ArtPlatform/.idea/.gitignore" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/../ArtPlatform/.idea/.idea.ArtPlatform/.idea/aws.xml" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/../ArtPlatform/.idea/.idea.ArtPlatform/.idea/encodings.xml" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/../ArtPlatform/.idea/.idea.ArtPlatform/.idea/indexLayout.xml" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/../ArtPlatform/.idea/.idea.ArtPlatform/.idea/vcs.xml" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/../ArtPlatform/ArtPlaform.DAL/ArtPlaform.DAL.csproj" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/../ArtPlatform/ArtPlaform.DAL/Class1.cs" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/../ArtPlatform/ArtPlatform.Api/ArtPlatform.Api.csproj" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/../ArtPlatform/ArtPlatform.Api/Controllers/WeatherForecastController.cs" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/../ArtPlatform/ArtPlatform.Api/Dockerfile" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/../ArtPlatform/ArtPlatform.Api/Program.cs" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/../ArtPlatform/ArtPlatform.Api/Properties/launchSettings.json" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/../ArtPlatform/ArtPlatform.Api/WeatherForecast.cs" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/../ArtPlatform/ArtPlatform.Api/appsettings.Development.json" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/../ArtPlatform/ArtPlatform.Api/appsettings.json" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/../ArtPlatform/ArtPlatform.DatabaseUpdater/ArtPlatform.DatabaseUpdater.csproj" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/../ArtPlatform/ArtPlatform.DatabaseUpdater/Dockerfile" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/../ArtPlatform/ArtPlatform.DatabaseUpdater/Program.cs" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/../ArtPlatform/ArtPlatform.sln" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/../Damien.ArtPlatform/.idea/.idea.Damien.ArtPlatform/.idea/aws.xml" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/../Damien.ArtPlatform/.idea/.idea.Damien.ArtPlatform/.idea/indexLayout.xml" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/../Damien.ArtPlatform/.idea/.idea.Damien.ArtPlatform/.idea/projectSettingsUpdater.xml" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/../Damien.ArtPlatform/.idea/.idea.Damien.ArtPlatform/.idea/vcs.xml" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/../Damien.ArtPlatform/.idea/.idea.Damien.ArtPlatform/.idea/workspace.xml" beforeDir="false" />
</list>
<option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" />
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
<option name="LAST_RESOLUTION" value="IGNORE" />
</component>
<component name="Git.Settings">
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$/.." />
</component>
<component name="KubernetesApiProvider">{
&quot;contexts&quot;: [
{
&quot;name&quot;: &quot;minikube&quot;,
&quot;originalNamespace&quot;: &quot;default&quot;
}
],
&quot;isMigrated&quot;: true
}</component>
<component name="KubernetesSettings">
<option name="contextName" value="minikube" />
</component>
<component name="ProjectColorInfo">{
&quot;associatedIndex&quot;: 8
}</component>
<component name="ProjectId" id="2bVSVHjAxjbTSogi69zTRZwrMUs" />
<component name="ProjectLevelVcsManager">
<ConfirmationsSetting value="2" id="Add" />
</component>
<component name="ProjectViewState">
<option name="hideEmptyMiddlePackages" value="true" />
<option name="showLibraryContents" value="true" />
</component>
<component name="PropertiesComponent"><![CDATA[{
"keyToString": {
".NET Launch Settings Profile.ArtPlatform.API: https.executor": "Run",
".NET Project.ArtPlatform.Database.Migrator.executor": "Run",
"Docker.ArtPlatform.API/Dockerfile.executor": "Run",
"HTTP Request.All in generated-requests.executor": "Run",
"RunOnceActivity.OpenProjectViewOnStart": "true",
"RunOnceActivity.ShowReadmeOnStart": "true",
"git-widget-placeholder": "main",
"node.js.detected.package.eslint": "true",
"node.js.detected.package.tslint": "true",
"node.js.selected.package.eslint": "(autodetect)",
"node.js.selected.package.tslint": "(autodetect)",
"nodejs_package_manager_path": "npm",
"settings.editor.selected.configurable": "preferences.pluginManager",
"vue.rearranger.settings.migration": "true"
},
"keyToStringList": {
"DatabaseDriversLRU": [
"postgresql"
],
"rider.external.source.directories": [
"/home/damienostler/.config/JetBrains/Rider2023.3/resharper-host/DecompilerCache",
"/home/damienostler/.config/JetBrains/Rider2023.3/resharper-host/SourcesCache",
"/home/damienostler/.local/share/Symbols/src"
]
}
}]]></component>
<component name="RunManager" selected=".NET Launch Settings Profile.ArtPlatform.API: https">
<configuration name="ArtPlatform.Database.Migrator" type="DotNetProject" factoryName=".NET Project">
<option name="EXE_PATH" value="" />
<option name="PROGRAM_PARAMETERS" value="" />
<option name="WORKING_DIRECTORY" value="" />
<option name="PASS_PARENT_ENVS" value="1" />
<option name="USE_EXTERNAL_CONSOLE" value="0" />
<option name="USE_MONO" value="0" />
<option name="RUNTIME_ARGUMENTS" value="" />
<option name="PROJECT_PATH" value="$PROJECT_DIR$/ArtPlatform.Database.Migrator/ArtPlatform.Database.Migrator.csproj" />
<option name="PROJECT_EXE_PATH_TRACKING" value="1" />
<option name="PROJECT_ARGUMENTS_TRACKING" value="1" />
<option name="PROJECT_WORKING_DIRECTORY_TRACKING" value="1" />
<option name="PROJECT_KIND" value="DotNetCore" />
<option name="PROJECT_TFM" value="" />
<method v="2">
<option name="Build" />
</method>
</configuration>
<configuration name="All in generated-requests" type="HttpClient.HttpRequestRunConfigurationType" factoryName="HTTP Request" temporary="true" path="$APPLICATION_CONFIG_DIR$/scratches/generated-requests.http">
<method v="2" />
</configuration>
<configuration name="ArtPlatform.API: http" type="LaunchSettings" factoryName=".NET Launch Settings Profile">
<option name="LAUNCH_PROFILE_PROJECT_FILE_PATH" value="$PROJECT_DIR$/ArtPlatform.API/ArtPlatform.API.csproj" />
<option name="LAUNCH_PROFILE_TFM" value="net8.0" />
<option name="LAUNCH_PROFILE_NAME" value="http" />
<option name="USE_EXTERNAL_CONSOLE" value="0" />
<option name="USE_MONO" value="0" />
<option name="RUNTIME_ARGUMENTS" value="" />
<option name="GENERATE_APPLICATIONHOST_CONFIG" value="1" />
<option name="SHOW_IIS_EXPRESS_OUTPUT" value="0" />
<option name="SEND_DEBUG_REQUEST" value="1" />
<option name="ADDITIONAL_IIS_EXPRESS_ARGUMENTS" value="" />
<method v="2">
<option name="Build" />
</method>
</configuration>
<configuration name="ArtPlatform.API: https" type="LaunchSettings" factoryName=".NET Launch Settings Profile">
<option name="LAUNCH_PROFILE_PROJECT_FILE_PATH" value="$PROJECT_DIR$/ArtPlatform.API/ArtPlatform.API.csproj" />
<option name="LAUNCH_PROFILE_TFM" value="net8.0" />
<option name="LAUNCH_PROFILE_NAME" value="https" />
<option name="USE_EXTERNAL_CONSOLE" value="0" />
<option name="USE_MONO" value="0" />
<option name="RUNTIME_ARGUMENTS" value="" />
<option name="GENERATE_APPLICATIONHOST_CONFIG" value="1" />
<option name="SHOW_IIS_EXPRESS_OUTPUT" value="0" />
<option name="SEND_DEBUG_REQUEST" value="1" />
<option name="ADDITIONAL_IIS_EXPRESS_ARGUMENTS" value="" />
<method v="2">
<option name="Build" />
</method>
</configuration>
<configuration name="ArtPlatform.API/Dockerfile" type="docker-deploy" factoryName="dockerfile" server-name="Docker">
<deployment type="dockerfile">
<settings>
<option name="imageTag" value="artplatform.api" />
<option name="containerName" value="artplatform.api" />
<option name="contextFolderPath" value="$PROJECT_DIR$" />
<option name="portBindings">
<list>
<DockerPortBindingImpl>
<option name="containerPort" value="8080" />
<option name="hostIp" value="127.0.0.1" />
<option name="hostPort" value="8080" />
</DockerPortBindingImpl>
</list>
</option>
<option name="sourceFilePath" value="ArtPlatform.API/Dockerfile" />
</settings>
</deployment>
<EXTENSION ID="com.jetbrains.rider.docker.debug" isFastModeEnabled="true" isSslEnabled="false" />
<method v="2" />
</configuration>
<configuration default="true" type="docker-deploy" factoryName="dockerfile" temporary="true">
<deployment type="dockerfile">
<settings />
</deployment>
<EXTENSION ID="com.jetbrains.rider.docker.debug" isFastModeEnabled="true" isSslEnabled="false" />
<method v="2" />
</configuration>
<recent_temporary>
<list>
<item itemvalue="HTTP Request.All in generated-requests" />
</list>
</recent_temporary>
</component>
<component name="SpellCheckerSettings" RuntimeDictionaries="0" Folders="0" CustomDictionaries="0" DefaultDictionary="application-level" UseSingleDictionary="true" transferred="true" />
<component name="TaskManager">
<task active="true" id="Default" summary="Default task">
<changelist id="e251c08f-6fd2-4319-a6ec-5f03319157f3" name="Changes" comment="" />
<created>1706298775013</created>
<option name="number" value="Default" />
<option name="presentableId" value="Default" />
<updated>1706298775013</updated>
<workItem from="1706298780176" duration="5462000" />
<workItem from="1706328737604" duration="1191000" />
<workItem from="1706329945610" duration="25965000" />
</task>
<servers />
</component>
<component name="TypeScriptGeneratedFilesManager">
<option name="version" value="3" />
</component>
<component name="VcsManagerConfiguration">
<option name="CLEAR_INITIAL_COMMIT_MESSAGE" value="true" />
</component>
</project>

View File

@ -1,9 +0,0 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
</Project>

View File

@ -1,5 +0,0 @@
namespace ArtPlaform.DAL;
public class Class1
{
}

View File

@ -1,20 +0,0 @@
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
<DockerDefaultTargetOS>Linux</DockerDefaultTargetOS>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.5.0"/>
</ItemGroup>
<ItemGroup>
<Content Include="..\.dockerignore">
<Link>.dockerignore</Link>
</Content>
</ItemGroup>
</Project>

View File

@ -1,32 +0,0 @@
using Microsoft.AspNetCore.Mvc;
namespace ArtPlatform.Api.Controllers;
[ApiController]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase
{
private static readonly string[] Summaries = new[]
{
"Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
};
private readonly ILogger<WeatherForecastController> _logger;
public WeatherForecastController(ILogger<WeatherForecastController> logger)
{
_logger = logger;
}
[HttpGet(Name = "GetWeatherForecast")]
public IEnumerable<WeatherForecast> Get()
{
return Enumerable.Range(1, 5).Select(index => new WeatherForecast
{
Date = DateTime.Now.AddDays(index),
TemperatureC = Random.Shared.Next(-20, 55),
Summary = Summaries[Random.Shared.Next(Summaries.Length)]
})
.ToArray();
}
}

View File

@ -1,22 +0,0 @@
FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443
FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
ARG BUILD_CONFIGURATION=Release
WORKDIR /src
COPY ["ArtPlatform.Api/ArtPlatform.Api.csproj", "ArtPlatform.Api/"]
RUN dotnet restore "ArtPlatform.Api/ArtPlatform.Api.csproj"
COPY . .
WORKDIR "/src/ArtPlatform.Api"
RUN dotnet build "ArtPlatform.Api.csproj" -c $BUILD_CONFIGURATION -o /app/build
FROM build AS publish
ARG BUILD_CONFIGURATION=Release
RUN dotnet publish "ArtPlatform.Api.csproj" -c $BUILD_CONFIGURATION -o /app/publish /p:UseAppHost=false
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "ArtPlatform.Api.dll"]

View File

@ -1,25 +0,0 @@
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
var app = builder.Build();
// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();
app.Run();

View File

@ -1,12 +0,0 @@
namespace ArtPlatform.Api;
public class WeatherForecast
{
public DateTime Date { get; set; }
public int TemperatureC { get; set; }
public int TemperatureF => 32 + (int)(TemperatureC / 0.5556);
public string? Summary { get; set; }
}

View File

@ -1,9 +0,0 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*"
}

View File

@ -1,17 +0,0 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net6.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<DockerDefaultTargetOS>Linux</DockerDefaultTargetOS>
</PropertyGroup>
<ItemGroup>
<Content Include="..\.dockerignore">
<Link>.dockerignore</Link>
</Content>
</ItemGroup>
</Project>

View File

@ -1,20 +0,0 @@
FROM mcr.microsoft.com/dotnet/runtime:6.0 AS base
WORKDIR /app
FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
ARG BUILD_CONFIGURATION=Release
WORKDIR /src
COPY ["ArtPlatform.DatabaseUpdater/ArtPlatform.DatabaseUpdater.csproj", "ArtPlatform.DatabaseUpdater/"]
RUN dotnet restore "ArtPlatform.DatabaseUpdater/ArtPlatform.DatabaseUpdater.csproj"
COPY . .
WORKDIR "/src/ArtPlatform.DatabaseUpdater"
RUN dotnet build "ArtPlatform.DatabaseUpdater.csproj" -c $BUILD_CONFIGURATION -o /app/build
FROM build AS publish
ARG BUILD_CONFIGURATION=Release
RUN dotnet publish "ArtPlatform.DatabaseUpdater.csproj" -c $BUILD_CONFIGURATION -o /app/publish /p:UseAppHost=false
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "ArtPlatform.DatabaseUpdater.dll"]

View File

@ -1 +0,0 @@
Console.WriteLine("Hello, World!");

View File

@ -1,28 +0,0 @@

Microsoft Visual Studio Solution File, Format Version 12.00
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ArtPlatform.Api", "ArtPlatform.Api\ArtPlatform.Api.csproj", "{BC5949C8-6B4E-447E-92AC-8472116FCD9D}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ArtPlaform.DAL", "ArtPlaform.DAL\ArtPlaform.DAL.csproj", "{9950751C-C51D-4846-AFA4-D516F55620C3}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ArtPlatform.DatabaseUpdater", "ArtPlatform.DatabaseUpdater\ArtPlatform.DatabaseUpdater.csproj", "{10EE4F10-8980-4C5F-AE6D-AC159EF95024}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{BC5949C8-6B4E-447E-92AC-8472116FCD9D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{BC5949C8-6B4E-447E-92AC-8472116FCD9D}.Debug|Any CPU.Build.0 = Debug|Any CPU
{BC5949C8-6B4E-447E-92AC-8472116FCD9D}.Release|Any CPU.ActiveCfg = Release|Any CPU
{BC5949C8-6B4E-447E-92AC-8472116FCD9D}.Release|Any CPU.Build.0 = Release|Any CPU
{9950751C-C51D-4846-AFA4-D516F55620C3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{9950751C-C51D-4846-AFA4-D516F55620C3}.Debug|Any CPU.Build.0 = Debug|Any CPU
{9950751C-C51D-4846-AFA4-D516F55620C3}.Release|Any CPU.ActiveCfg = Release|Any CPU
{9950751C-C51D-4846-AFA4-D516F55620C3}.Release|Any CPU.Build.0 = Release|Any CPU
{10EE4F10-8980-4C5F-AE6D-AC159EF95024}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{10EE4F10-8980-4C5F-AE6D-AC159EF95024}.Debug|Any CPU.Build.0 = Debug|Any CPU
{10EE4F10-8980-4C5F-AE6D-AC159EF95024}.Release|Any CPU.ActiveCfg = Release|Any CPU
{10EE4F10-8980-4C5F-AE6D-AC159EF95024}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
EndGlobal

View File

@ -1,20 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="accountSettings">
<option name="activeProfile" value="profile:default" />
<option name="activeRegion" value="us-east-1" />
<option name="recentlyUsedProfiles">
<list>
<option value="profile:default" />
</list>
</option>
<option name="recentlyUsedRegions">
<list>
<option value="us-east-1" />
</list>
</option>
</component>
<component name="explorerToolWindow">
<option name="selectedTab" value="Amazon Q + CodeWhisperer" />
</component>
</project>

View File

@ -1,8 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="UserContentModel">
<attachedFolders />
<explicitIncludes />
<explicitExcludes />
</component>
</project>

View File

@ -1,6 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="RiderProjectSettingsUpdater">
<option name="vcsConfiguration" value="2" />
</component>
</project>

View File

@ -1,6 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$/.." vcs="Git" />
</component>
</project>

View File

@ -1,114 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="AutoGeneratedRunConfigurationManager">
<projectFile profileName="Damien.ArtPlatform">Damien.ArtPlatform.csproj</projectFile>
</component>
<component name="AutoImportSettings">
<option name="autoReloadType" value="SELECTIVE" />
</component>
<component name="ChangeListManager">
<list default="true" id="254f5558-0caf-48c9-8139-28250aa5f655" name="Changes" comment="">
<change afterPath="$PROJECT_DIR$/../ArtPlatform/ArtPlatform.Api/ArtPlatform.Api.csproj" afterDir="false" />
<change afterPath="$PROJECT_DIR$/../ArtPlatform/ArtPlatform.Api/Controllers/WeatherForecastController.cs" afterDir="false" />
<change afterPath="$PROJECT_DIR$/../ArtPlatform/ArtPlatform.Api/Program.cs" afterDir="false" />
<change afterPath="$PROJECT_DIR$/../ArtPlatform/ArtPlatform.Api/Properties/launchSettings.json" afterDir="false" />
<change afterPath="$PROJECT_DIR$/../ArtPlatform/ArtPlatform.Api/WeatherForecast.cs" afterDir="false" />
<change afterPath="$PROJECT_DIR$/../ArtPlatform/ArtPlatform.Api/appsettings.Development.json" afterDir="false" />
<change afterPath="$PROJECT_DIR$/../ArtPlatform/ArtPlatform.Api/appsettings.json" afterDir="false" />
</list>
<option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" />
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
<option name="LAST_RESOLUTION" value="IGNORE" />
</component>
<component name="Git.Settings">
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$/.." />
</component>
<component name="ProjectColorInfo"><![CDATA[{
"associatedIndex": 6
}]]></component>
<component name="ProjectId" id="2bKuauvXoud9NB1keP5ijmPwhnY" />
<component name="ProjectLevelVcsManager">
<ConfirmationsSetting value="2" id="Add" />
</component>
<component name="ProjectViewState">
<option name="hideEmptyMiddlePackages" value="true" />
<option name="showLibraryContents" value="true" />
</component>
<component name="PropertiesComponent"><![CDATA[{
"keyToString": {
"ASKED_ADD_EXTERNAL_FILES": "true",
"RunOnceActivity.OpenProjectViewOnStart": "true",
"RunOnceActivity.ShowReadmeOnStart": "true",
"git-widget-placeholder": "main",
"node.js.detected.package.eslint": "true",
"node.js.detected.package.tslint": "true",
"node.js.selected.package.eslint": "(autodetect)",
"node.js.selected.package.tslint": "(autodetect)",
"nodejs_package_manager_path": "npm",
"settings.editor.selected.configurable": "preferences.pluginManager",
"vue.rearranger.settings.migration": "true"
}
}]]></component>
<component name="RunManager" selected=".NET Launch Settings Profile.Damien.ArtPlatform">
<configuration name="Damien.ArtPlatform" type="LaunchSettings" factoryName=".NET Launch Settings Profile">
<option name="LAUNCH_PROFILE_PROJECT_FILE_PATH" value="$PROJECT_DIR$/Damien.ArtPlatform.csproj" />
<option name="LAUNCH_PROFILE_TFM" value="net6.0" />
<option name="LAUNCH_PROFILE_NAME" value="Damien.ArtPlatform" />
<option name="USE_EXTERNAL_CONSOLE" value="0" />
<option name="USE_MONO" value="0" />
<option name="RUNTIME_ARGUMENTS" value="" />
<option name="GENERATE_APPLICATIONHOST_CONFIG" value="1" />
<option name="SHOW_IIS_EXPRESS_OUTPUT" value="0" />
<option name="SEND_DEBUG_REQUEST" value="1" />
<option name="ADDITIONAL_IIS_EXPRESS_ARGUMENTS" value="" />
<method v="2">
<option name="Build" />
</method>
</configuration>
<configuration name="Dockerfile" type="docker-deploy" factoryName="dockerfile" server-name="Docker">
<deployment type="dockerfile">
<settings>
<option name="imageTag" value="damien.artplatform" />
<option name="containerName" value="damien.artplatform" />
<option name="contextFolderPath" value="$PROJECT_DIR$" />
<option name="portBindings">
<list>
<DockerPortBindingImpl>
<option name="containerPort" value="80" />
<option name="hostIp" value="127.0.0.1" />
<option name="hostPort" value="8080" />
</DockerPortBindingImpl>
</list>
</option>
<option name="sourceFilePath" value="Dockerfile" />
</settings>
</deployment>
<EXTENSION ID="com.jetbrains.rider.docker.debug" isFastModeEnabled="true" isSslEnabled="false" />
<method v="2" />
</configuration>
<configuration default="true" type="docker-deploy" factoryName="dockerfile" temporary="true">
<deployment type="dockerfile" />
<method v="2" />
</configuration>
</component>
<component name="SpellCheckerSettings" RuntimeDictionaries="0" Folders="0" CustomDictionaries="0" DefaultDictionary="application-level" UseSingleDictionary="true" transferred="true" />
<component name="TaskManager">
<task active="true" id="Default" summary="Default task">
<changelist id="254f5558-0caf-48c9-8139-28250aa5f655" name="Changes" comment="" />
<created>1705976158668</created>
<option name="number" value="Default" />
<option name="presentableId" value="Default" />
<updated>1705976158668</updated>
<workItem from="1705976159791" duration="435000" />
</task>
<servers />
</component>
<component name="TypeScriptGeneratedFilesManager">
<option name="version" value="3" />
</component>
<component name="VcsManagerConfiguration">
<option name="ADD_EXTERNAL_FILES_SILENTLY" value="true" />
<option name="CLEAR_INITIAL_COMMIT_MESSAGE" value="true" />
</component>
</project>

View File

@ -0,0 +1,370 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="AutoGeneratedRunConfigurationManager">
<projectFile profileName="http">ArtPlatform.API/ArtPlatform.API.csproj</projectFile>
<projectFile profileName="https">ArtPlatform.API/ArtPlatform.API.csproj</projectFile>
<projectFile profileName="http">ArtPlatform.App/ArtPlatform.App.csproj</projectFile>
<projectFile profileName="https">ArtPlatform.App/ArtPlatform.App.csproj</projectFile>
<projectFile>ArtPlatform.Database.Migrator/ArtPlatform.Database.Migrator.csproj</projectFile>
<projectFile profileName="https">ArtPlatform.UI/ArtPlatform.UI.csproj</projectFile>
<projectFile profileName="http">ArtPlatform.WebApp/ArtPlatform.WebApp.csproj</projectFile>
<projectFile profileName="https">ArtPlatform.WebApp/ArtPlatform.WebApp.csproj</projectFile>
<projectFile profileName="http">ArtPlatform.WebApplication/ArtPlatform.WebApplication.csproj</projectFile>
<projectFile profileName="https">ArtPlatform.WebApplication/ArtPlatform.WebApplication.csproj</projectFile>
<projectFile profileName="http">ArtPlatform/ArtPlatform.csproj</projectFile>
<projectFile profileName="https">ArtPlatform/ArtPlatform.csproj</projectFile>
</component>
<component name="AutoImportSettings">
<option name="autoReloadType" value="SELECTIVE" />
</component>
<component name="ChangeListManager">
<list default="true" id="e251c08f-6fd2-4319-a6ec-5f03319157f3" name="Changes" comment="">
<change afterPath="$PROJECT_DIR$/.dockerignore" afterDir="false" />
<change afterPath="$PROJECT_DIR$/.idea/.idea.ArtPlatform.Database/.idea/workspace.xml" afterDir="false" />
<change afterPath="$PROJECT_DIR$/ArtPlatform.Database/ApplicationDatabaseConfigurationModel.cs" afterDir="false" />
<change afterPath="$PROJECT_DIR$/ArtPlatform.Database/ApplicationDbContext.cs" afterDir="false" />
<change afterPath="$PROJECT_DIR$/ArtPlatform.Database/ArtPlatform.Database.csproj" afterDir="false" />
<change afterPath="$PROJECT_DIR$/ArtPlatform.Database/Entities/SellerConfiguredSetting.cs" afterDir="false" />
<change afterPath="$PROJECT_DIR$/ArtPlatform.Database/Entities/SellerProfilePortfolioPiece.cs" afterDir="false" />
<change afterPath="$PROJECT_DIR$/ArtPlatform.Database/Entities/SellerService.cs" afterDir="false" />
<change afterPath="$PROJECT_DIR$/ArtPlatform.Database/Entities/SellerServiceOrder.cs" afterDir="false" />
<change afterPath="$PROJECT_DIR$/ArtPlatform.Database/Entities/SellerServiceOrderMessage.cs" afterDir="false" />
<change afterPath="$PROJECT_DIR$/ArtPlatform.Database/Entities/SellerServiceOrderMessageAttachment.cs" afterDir="false" />
<change afterPath="$PROJECT_DIR$/ArtPlatform.Database/Entities/SellerServiceOrderReview.cs" afterDir="false" />
<change afterPath="$PROJECT_DIR$/ArtPlatform.Database/Entities/SellerSetting.cs" afterDir="false" />
<change afterPath="$PROJECT_DIR$/ArtPlatform.Database/Entities/User.cs" afterDir="false" />
<change afterPath="$PROJECT_DIR$/ArtPlatform.Database/Entities/UserSellerProfile.cs" afterDir="false" />
<change afterPath="$PROJECT_DIR$/ArtPlatform.Database/Enums/EnumOrderStatus.cs" afterDir="false" />
<change afterPath="$PROJECT_DIR$/ArtPlatform.sln" afterDir="false" />
<change beforePath="$PROJECT_DIR$/../ArtPlatform/.dockerignore" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/../ArtPlatform/.idea/.idea.ArtPlatform/.idea/.gitignore" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/../ArtPlatform/.idea/.idea.ArtPlatform/.idea/aws.xml" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/../ArtPlatform/.idea/.idea.ArtPlatform/.idea/encodings.xml" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/../ArtPlatform/.idea/.idea.ArtPlatform/.idea/indexLayout.xml" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/../ArtPlatform/.idea/.idea.ArtPlatform/.idea/vcs.xml" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/../ArtPlatform/ArtPlaform.DAL/ArtPlaform.DAL.csproj" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/../ArtPlatform/ArtPlaform.DAL/Class1.cs" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/../ArtPlatform/ArtPlatform.Api/ArtPlatform.Api.csproj" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/../ArtPlatform/ArtPlatform.Api/Controllers/WeatherForecastController.cs" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/../ArtPlatform/ArtPlatform.Api/Dockerfile" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/../ArtPlatform/ArtPlatform.Api/Program.cs" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/../ArtPlatform/ArtPlatform.Api/Properties/launchSettings.json" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/../ArtPlatform/ArtPlatform.Api/WeatherForecast.cs" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/../ArtPlatform/ArtPlatform.Api/appsettings.Development.json" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/../ArtPlatform/ArtPlatform.Api/appsettings.json" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/../ArtPlatform/ArtPlatform.DatabaseUpdater/ArtPlatform.DatabaseUpdater.csproj" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/../ArtPlatform/ArtPlatform.DatabaseUpdater/Dockerfile" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/../ArtPlatform/ArtPlatform.DatabaseUpdater/Program.cs" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/../ArtPlatform/ArtPlatform.sln" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/../Damien.ArtPlatform/.idea/.idea.Damien.ArtPlatform/.idea/aws.xml" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/../Damien.ArtPlatform/.idea/.idea.Damien.ArtPlatform/.idea/indexLayout.xml" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/../Damien.ArtPlatform/.idea/.idea.Damien.ArtPlatform/.idea/projectSettingsUpdater.xml" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/../Damien.ArtPlatform/.idea/.idea.Damien.ArtPlatform/.idea/vcs.xml" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/../Damien.ArtPlatform/.idea/.idea.Damien.ArtPlatform/.idea/workspace.xml" beforeDir="false" />
</list>
<option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" />
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
<option name="LAST_RESOLUTION" value="IGNORE" />
</component>
<component name="Git.Settings">
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$/.." />
</component>
<component name="ProjectColorInfo"><![CDATA[{
"associatedIndex": 8
}]]></component>
<component name="ProjectId" id="2bVSVHjAxjbTSogi69zTRZwrMUs" />
<component name="ProjectLevelVcsManager">
<ConfirmationsSetting value="2" id="Add" />
</component>
<component name="ProjectViewState">
<option name="hideEmptyMiddlePackages" value="true" />
<option name="showLibraryContents" value="true" />
</component>
<component name="PropertiesComponent"><![CDATA[{
"keyToString": {
".NET Launch Settings Profile.ArtPlatform.API: http.executor": "Run",
".NET Launch Settings Profile.ArtPlatform.App: http.executor": "Run",
".NET Launch Settings Profile.ArtPlatform.WebApp: http.executor": "Run",
"RunOnceActivity.OpenProjectViewOnStart": "true",
"RunOnceActivity.ShowReadmeOnStart": "true",
"git-widget-placeholder": "main",
"last_opened_file_path": "/home/damienostler/Documents/Github Repositories/art_platform/ArtPlatform.Database/ArtPlatform/ArtPlatform.sln",
"node.js.detected.package.eslint": "true",
"node.js.detected.package.tslint": "true",
"node.js.selected.package.eslint": "(autodetect)",
"node.js.selected.package.tslint": "(autodetect)",
"nodejs_package_manager_path": "npm",
"settings.editor.selected.configurable": "preferences.pluginManager",
"vue.rearranger.settings.migration": "true"
},
"keyToStringList": {
"DatabaseDriversLRU": [
"postgresql"
],
"rider.external.source.directories": [
"/home/damienostler/.config/JetBrains/Rider2023.3/resharper-host/DecompilerCache",
"/home/damienostler/.config/JetBrains/Rider2023.3/resharper-host/SourcesCache",
"/home/damienostler/.local/share/Symbols/src"
]
}
}]]></component>
<component name="RunManager" selected=".NET Launch Settings Profile.ArtPlatform.App: http">
<configuration name="ArtPlatform.Database.Migrator" type="DotNetProject" factoryName=".NET Project">
<option name="EXE_PATH" value="" />
<option name="PROGRAM_PARAMETERS" value="" />
<option name="WORKING_DIRECTORY" value="" />
<option name="PASS_PARENT_ENVS" value="1" />
<option name="USE_EXTERNAL_CONSOLE" value="0" />
<option name="USE_MONO" value="0" />
<option name="RUNTIME_ARGUMENTS" value="" />
<option name="PROJECT_PATH" value="$PROJECT_DIR$/ArtPlatform.Database.Migrator/ArtPlatform.Database.Migrator.csproj" />
<option name="PROJECT_EXE_PATH_TRACKING" value="1" />
<option name="PROJECT_ARGUMENTS_TRACKING" value="1" />
<option name="PROJECT_WORKING_DIRECTORY_TRACKING" value="1" />
<option name="PROJECT_KIND" value="DotNetCore" />
<option name="PROJECT_TFM" value="" />
<method v="2">
<option name="Build" />
</method>
</configuration>
<configuration name="ArtPlatform: http" type="LaunchSettings" factoryName=".NET Launch Settings Profile">
<option name="LAUNCH_PROFILE_PROJECT_FILE_PATH" value="$PROJECT_DIR$/ArtPlatform/ArtPlatform.csproj" />
<option name="LAUNCH_PROFILE_TFM" value="net8.0" />
<option name="LAUNCH_PROFILE_NAME" value="http" />
<option name="USE_EXTERNAL_CONSOLE" value="0" />
<option name="USE_MONO" value="0" />
<option name="RUNTIME_ARGUMENTS" value="" />
<option name="GENERATE_APPLICATIONHOST_CONFIG" value="1" />
<option name="SHOW_IIS_EXPRESS_OUTPUT" value="0" />
<option name="SEND_DEBUG_REQUEST" value="1" />
<option name="ADDITIONAL_IIS_EXPRESS_ARGUMENTS" value="" />
<method v="2">
<option name="Build" />
</method>
</configuration>
<configuration name="ArtPlatform: https" type="LaunchSettings" factoryName=".NET Launch Settings Profile">
<option name="LAUNCH_PROFILE_PROJECT_FILE_PATH" value="$PROJECT_DIR$/ArtPlatform/ArtPlatform.csproj" />
<option name="LAUNCH_PROFILE_TFM" value="net8.0" />
<option name="LAUNCH_PROFILE_NAME" value="https" />
<option name="USE_EXTERNAL_CONSOLE" value="0" />
<option name="USE_MONO" value="0" />
<option name="RUNTIME_ARGUMENTS" value="" />
<option name="GENERATE_APPLICATIONHOST_CONFIG" value="1" />
<option name="SHOW_IIS_EXPRESS_OUTPUT" value="0" />
<option name="SEND_DEBUG_REQUEST" value="1" />
<option name="ADDITIONAL_IIS_EXPRESS_ARGUMENTS" value="" />
<method v="2">
<option name="Build" />
</method>
</configuration>
<configuration name="ArtPlatform.API: https" type="LaunchSettings" factoryName=".NET Launch Settings Profile">
<option name="LAUNCH_PROFILE_PROJECT_FILE_PATH" value="$PROJECT_DIR$/ArtPlatform.API/ArtPlatform.API.csproj" />
<option name="LAUNCH_PROFILE_TFM" value="net8.0" />
<option name="LAUNCH_PROFILE_NAME" value="https" />
<option name="USE_EXTERNAL_CONSOLE" value="0" />
<option name="USE_MONO" value="0" />
<option name="RUNTIME_ARGUMENTS" value="" />
<option name="GENERATE_APPLICATIONHOST_CONFIG" value="1" />
<option name="SHOW_IIS_EXPRESS_OUTPUT" value="0" />
<option name="SEND_DEBUG_REQUEST" value="1" />
<option name="ADDITIONAL_IIS_EXPRESS_ARGUMENTS" value="" />
<method v="2">
<option name="Build" />
</method>
</configuration>
<configuration name="ArtPlatform.App: http" type="LaunchSettings" factoryName=".NET Launch Settings Profile">
<option name="LAUNCH_PROFILE_PROJECT_FILE_PATH" value="$PROJECT_DIR$/ArtPlatform.App/ArtPlatform.App.csproj" />
<option name="LAUNCH_PROFILE_TFM" value="net8.0" />
<option name="LAUNCH_PROFILE_NAME" value="http" />
<option name="USE_EXTERNAL_CONSOLE" value="0" />
<option name="USE_MONO" value="0" />
<option name="RUNTIME_ARGUMENTS" value="" />
<option name="GENERATE_APPLICATIONHOST_CONFIG" value="1" />
<option name="SHOW_IIS_EXPRESS_OUTPUT" value="0" />
<option name="SEND_DEBUG_REQUEST" value="1" />
<option name="ADDITIONAL_IIS_EXPRESS_ARGUMENTS" value="" />
<method v="2">
<option name="Build" />
</method>
</configuration>
<configuration name="ArtPlatform.App: https" type="LaunchSettings" factoryName=".NET Launch Settings Profile">
<option name="LAUNCH_PROFILE_PROJECT_FILE_PATH" value="$PROJECT_DIR$/ArtPlatform.App/ArtPlatform.App.csproj" />
<option name="LAUNCH_PROFILE_TFM" value="net8.0" />
<option name="LAUNCH_PROFILE_NAME" value="https" />
<option name="USE_EXTERNAL_CONSOLE" value="0" />
<option name="USE_MONO" value="0" />
<option name="RUNTIME_ARGUMENTS" value="" />
<option name="GENERATE_APPLICATIONHOST_CONFIG" value="1" />
<option name="SHOW_IIS_EXPRESS_OUTPUT" value="0" />
<option name="SEND_DEBUG_REQUEST" value="1" />
<option name="ADDITIONAL_IIS_EXPRESS_ARGUMENTS" value="" />
<method v="2">
<option name="Build" />
</method>
</configuration>
<configuration name="ArtPlatform.WebApplication: https" type="LaunchSettings" factoryName=".NET Launch Settings Profile">
<option name="LAUNCH_PROFILE_PROJECT_FILE_PATH" value="$PROJECT_DIR$/ArtPlatform.WebApplication/ArtPlatform.WebApplication.csproj" />
<option name="LAUNCH_PROFILE_TFM" value="net8.0" />
<option name="LAUNCH_PROFILE_NAME" value="https" />
<option name="USE_EXTERNAL_CONSOLE" value="0" />
<option name="USE_MONO" value="0" />
<option name="RUNTIME_ARGUMENTS" value="" />
<option name="GENERATE_APPLICATIONHOST_CONFIG" value="1" />
<option name="SHOW_IIS_EXPRESS_OUTPUT" value="0" />
<option name="SEND_DEBUG_REQUEST" value="1" />
<option name="ADDITIONAL_IIS_EXPRESS_ARGUMENTS" value="" />
<method v="2">
<option name="Build" />
</method>
</configuration>
<configuration name="ArtPlatform.API/Dockerfile" type="docker-deploy" factoryName="dockerfile" server-name="Docker">
<deployment type="dockerfile">
<settings>
<option name="imageTag" value="artplatform.api" />
<option name="containerName" value="artplatform.api" />
<option name="contextFolderPath" value="$PROJECT_DIR$" />
<option name="portBindings">
<list>
<DockerPortBindingImpl>
<option name="containerPort" value="8080" />
<option name="hostIp" value="127.0.0.1" />
<option name="hostPort" value="8080" />
</DockerPortBindingImpl>
</list>
</option>
<option name="sourceFilePath" value="ArtPlatform.API/Dockerfile" />
</settings>
</deployment>
<EXTENSION ID="com.jetbrains.rider.docker.debug" isFastModeEnabled="true" isSslEnabled="false" />
<method v="2" />
</configuration>
<configuration name="ArtPlatform.App/Dockerfile" type="docker-deploy" factoryName="dockerfile" server-name="Docker">
<deployment type="dockerfile">
<settings>
<option name="imageTag" value="artplatform.app" />
<option name="containerName" value="artplatform.app" />
<option name="contextFolderPath" value="$PROJECT_DIR$" />
<option name="portBindings">
<list>
<DockerPortBindingImpl>
<option name="containerPort" value="8080" />
<option name="hostIp" value="127.0.0.1" />
<option name="hostPort" value="8080" />
</DockerPortBindingImpl>
</list>
</option>
<option name="sourceFilePath" value="ArtPlatform.App/Dockerfile" />
</settings>
</deployment>
<EXTENSION ID="com.jetbrains.rider.docker.debug" isFastModeEnabled="true" isSslEnabled="false" />
<method v="2" />
</configuration>
<configuration name="ArtPlatform/Dockerfile" type="docker-deploy" factoryName="dockerfile" server-name="Docker">
<deployment type="dockerfile">
<settings>
<option name="imageTag" value="artplatform" />
<option name="containerName" value="artplatform" />
<option name="contextFolderPath" value="$PROJECT_DIR$" />
<option name="portBindings">
<list>
<DockerPortBindingImpl>
<option name="containerPort" value="8080" />
<option name="hostIp" value="127.0.0.1" />
<option name="hostPort" value="8080" />
</DockerPortBindingImpl>
</list>
</option>
<option name="sourceFilePath" value="ArtPlatform/Dockerfile" />
</settings>
</deployment>
<EXTENSION ID="com.jetbrains.rider.docker.debug" isFastModeEnabled="true" isSslEnabled="false" />
<method v="2" />
</configuration>
<configuration name="ArtPlatform.UI/Dockerfile" type="docker-deploy" factoryName="dockerfile" server-name="Docker">
<deployment type="dockerfile">
<settings>
<option name="imageTag" value="artplatform.ui" />
<option name="containerName" value="artplatform.ui" />
<option name="contextFolderPath" value="$PROJECT_DIR$" />
<option name="portBindings">
<list>
<DockerPortBindingImpl>
<option name="containerPort" value="8080" />
<option name="hostIp" value="127.0.0.1" />
<option name="hostPort" value="8080" />
</DockerPortBindingImpl>
</list>
</option>
<option name="sourceFilePath" value="ArtPlatform.UI/Dockerfile" />
</settings>
</deployment>
<EXTENSION ID="com.jetbrains.rider.docker.debug" isFastModeEnabled="true" isSslEnabled="false" />
<method v="2" />
</configuration>
<configuration name="ArtPlatform.WebApp/Dockerfile" type="docker-deploy" factoryName="dockerfile" server-name="Docker">
<deployment type="dockerfile">
<settings>
<option name="imageTag" value="artplatform.webapp" />
<option name="containerName" value="artplatform.webapp" />
<option name="contextFolderPath" value="$PROJECT_DIR$" />
<option name="portBindings">
<list>
<DockerPortBindingImpl>
<option name="containerPort" value="8080" />
<option name="hostIp" value="127.0.0.1" />
<option name="hostPort" value="8080" />
</DockerPortBindingImpl>
</list>
</option>
<option name="sourceFilePath" value="ArtPlatform.WebApp/Dockerfile" />
</settings>
</deployment>
<EXTENSION ID="com.jetbrains.rider.docker.debug" isFastModeEnabled="true" isSslEnabled="false" />
<method v="2" />
</configuration>
<configuration name="ArtPlatform.WebApplication/Dockerfile" type="docker-deploy" factoryName="dockerfile" server-name="Docker">
<deployment type="dockerfile">
<settings>
<option name="imageTag" value="artplatform.webapplication" />
<option name="containerName" value="artplatform.webapplication" />
<option name="contextFolderPath" value="$PROJECT_DIR$" />
<option name="portBindings">
<list>
<DockerPortBindingImpl>
<option name="containerPort" value="8080" />
<option name="hostIp" value="127.0.0.1" />
<option name="hostPort" value="8080" />
</DockerPortBindingImpl>
</list>
</option>
<option name="sourceFilePath" value="ArtPlatform.WebApplication/Dockerfile" />
</settings>
</deployment>
<EXTENSION ID="com.jetbrains.rider.docker.debug" isFastModeEnabled="true" isSslEnabled="false" />
<method v="2" />
</configuration>
<configuration default="true" type="docker-deploy" factoryName="dockerfile" temporary="true">
<deployment type="dockerfile" />
<method v="2" />
</configuration>
</component>
<component name="SpellCheckerSettings" RuntimeDictionaries="0" Folders="0" CustomDictionaries="0" DefaultDictionary="application-level" UseSingleDictionary="true" transferred="true" />
<component name="TaskManager">
<task active="true" id="Default" summary="Default task">
<changelist id="e251c08f-6fd2-4319-a6ec-5f03319157f3" name="Changes" comment="" />
<created>1706298775013</created>
<option name="number" value="Default" />
<option name="presentableId" value="Default" />
<updated>1706298775013</updated>
<workItem from="1706298780176" duration="10198000" />
</task>
<servers />
</component>
<component name="TypeScriptGeneratedFilesManager">
<option name="version" value="3" />
</component>
<component name="VcsManagerConfiguration">
<option name="CLEAR_INITIAL_COMMIT_MESSAGE" value="true" />
</component>
</project>

View File

@ -2,10 +2,10 @@
/shelf/ /shelf/
/workspace.xml /workspace.xml
# Rider ignored files # Rider ignored files
/.idea.ArtPlatform.iml
/contentModel.xml
/modules.xml /modules.xml
/contentModel.xml
/projectSettingsUpdater.xml /projectSettingsUpdater.xml
/.idea.ArtPlatform.Database.iml
# Editor-based HTTP Client requests # Editor-based HTTP Client requests
/httpRequests/ /httpRequests/
# Datasource local storage ignored files # Datasource local storage ignored files

1
src/.idea/.idea.ArtPlatform/.idea/.name generated Normal file
View File

@ -0,0 +1 @@
ArtPlatform

View File

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="DataSourceManagerImpl" format="xml" multifile-model="true">
<data-source source="LOCAL" name="postgres@localhost" uuid="f139dccd-eb47-4ad5-bb4f-f457f16ec1b7">
<driver-ref>postgresql</driver-ref>
<synchronize>true</synchronize>
<jdbc-driver>org.postgresql.Driver</jdbc-driver>
<jdbc-url>jdbc:postgresql://localhost:5432/postgres</jdbc-url>
<working-dir>$ProjectFileDir$</working-dir>
</data-source>
<data-source source="LOCAL" name="artplatform@localhost" uuid="e4a3d98b-bfa1-4036-a59a-24d9e362740e">
<driver-ref>postgresql</driver-ref>
<synchronize>true</synchronize>
<jdbc-driver>org.postgresql.Driver</jdbc-driver>
<jdbc-url>jdbc:postgresql://localhost:5432/artplatform</jdbc-url>
<working-dir>$ProjectFileDir$</working-dir>
</data-source>
</component>
</project>

View File

@ -0,0 +1,30 @@
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
<InvariantGlobalization>true</InvariantGlobalization>
<DockerDefaultTargetOS>Linux</DockerDefaultTargetOS>
</PropertyGroup>
<PropertyGroup>
<GenerateDocumentationFile>true</GenerateDocumentationFile>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Auth0.AspNetCore.Authentication" Version="1.4.1" />
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="8.0.1" />
<PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="8.0.1"/>
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.4.0"/>
</ItemGroup>
<ItemGroup>
<Content Include="..\.dockerignore">
<Link>.dockerignore</Link>
</Content>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\ArtPlatform.Database\ArtPlatform.Database.csproj" />
</ItemGroup>
</Project>

View File

@ -0,0 +1,69 @@
using ArtPlatform.API.Models.SellerProfileRequest;
using ArtPlatform.Database;
using ArtPlatform.Database.Entities;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
namespace ArtPlatform.API.Controllers;
[ApiController]
[Route("api/[controller]")]
public class AdminSellerProfileRequestsController : Controller
{
private readonly ApplicationDbContext _dbContext;
public AdminSellerProfileRequestsController(ApplicationDbContext dbContext)
{
_dbContext = dbContext;
}
[HttpGet]
[Authorize("read:seller-profile-request")]
[Route("SellerRequests")]
public async Task<IActionResult> GetSellerRequests(int offset = 0, int pageSize = 10)
{
var requests = _dbContext.SellerProfileRequests.Skip(offset).Take(pageSize).ToList();
var result = requests.Select(x=>x.ToModel()).ToList();
return Ok(result);
}
[HttpGet]
[Authorize("read:seller-profile-request")]
[Route("SellerRequests/Count")]
public async Task<IActionResult> GetSellerRequestsCount()
{
var result = _dbContext.SellerProfileRequests.Count();
return Ok(result);
}
[HttpPut]
[Authorize("write:seller-profile-request")]
[Route("SellerRequests/{userId}")]
public async Task<IActionResult> AcceptSellerRequest(string userId)
{
var request = await _dbContext.SellerProfileRequests.FirstOrDefaultAsync(request=>request.UserId==userId);
if(request==null)
return NotFound("No request for that user exists.");
if (request.Accepted == true)
return BadRequest("User is already a seller.");
request.Accepted = true;
request.AcceptedDate = DateTime.UtcNow;
var newSellerProfile = new UserSellerProfile()
{
UserId = userId,
AgeRestricted = false,
Biography = string.Empty,
SocialMediaLinks = new List<string>(){}
};
_dbContext.UserSellerProfiles.Add(newSellerProfile);
request = _dbContext.SellerProfileRequests.Update(request).Entity;
await _dbContext.SaveChangesAsync();
var result = request.ToModel();
return Ok(result);
}
}

View File

@ -0,0 +1,118 @@
using ArtPlatform.API.Models.Discovery;
using ArtPlatform.API.Models.SellerProfile;
using ArtPlatform.API.Models.SellerService;
using ArtPlatform.Database;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
namespace ArtPlatform.API.Controllers;
[ApiController]
[Route("api/[controller]")]
public class DiscoveryController : Controller
{
private readonly ApplicationDbContext _dbContext;
public DiscoveryController(ApplicationDbContext dbContext)
{
_dbContext = dbContext;
}
[HttpGet]
[Route("Sellers")]
public async Task<IActionResult> GetSellers(string search="",int offset = 0, int pageSize = 10)
{
var sellers = await _dbContext.UserSellerProfiles
.Where(x=>x.User.DisplayName.Contains(search))
.Include(x=>x.User)
.Skip(offset).Take(pageSize).ToListAsync();
var result = sellers.Select(x=>x.ToDiscoveryModel()).ToList();
return Ok(result);
}
[HttpGet]
[Route("Sellers/Count")]
public async Task<IActionResult> GetSellersCount(string search="")
{
var result = await _dbContext.UserSellerProfiles
.Where(x=>x.User.DisplayName.Contains(search))
.Include(x=>x.User)
.CountAsync();
return Ok(result);
}
[HttpGet]
[Route("Sellers/{sellerId:int}/Services")]
public async Task<IActionResult> GetSellerServices(int sellerId, int offset = 0, int pageSize = 10)
{
var seller = await _dbContext.UserSellerProfiles
.Include(x=>x.User)
.FirstOrDefaultAsync(x=>x.Id==sellerId);
if(seller==null)
return NotFound("Seller not found.");
var sellerServices = await _dbContext.SellerServices
.Include(x=>x.Reviews)
.Where(x=>x.SellerProfileId==sellerId)
.Skip(offset).Take(pageSize).ToListAsync();
var result = sellerServices.Select(x=>x.ToModel()).ToList();
return Ok(result);
}
[HttpGet]
[Route("Sellers/{sellerId:int}/Services/Count")]
public async Task<IActionResult> GetSellerServicesCount(int sellerId)
{
var seller = await _dbContext.UserSellerProfiles
.Include(x=>x.User)
.FirstOrDefaultAsync(x=>x.Id==sellerId);
if(seller==null)
return NotFound("Seller not found.");
var sellerServices = await _dbContext.SellerServices
.Include(x=>x.Reviews)
.Where(x=>x.SellerProfileId==sellerId)
.ToListAsync();
var result = sellerServices.Count;
return Ok(result);
}
[HttpGet]
[Route("Sellers/{sellerId:int}/Services/{serviceId:int}/Reviews")]
public async Task<IActionResult> GetSellerServiceReviews(int sellerId, int serviceId, int offset = 0, int pageSize = 10)
{
var seller = await _dbContext.UserSellerProfiles
.Include(x=>x.User)
.FirstOrDefaultAsync(x=>x.Id==sellerId);
if(seller==null)
return NotFound("Seller not found.");
var sellerService = await _dbContext.SellerServices
.Include(x=>x.Reviews).ThenInclude(x=>x.Reviewer)
.FirstOrDefaultAsync(x=>x.Id==serviceId);
if(sellerService==null)
return NotFound("Seller service not found.");
var result = sellerService.Reviews.Select(x=> new DiscoveryReviewModel()
{
Rating = x.Rating,
WriterDisplayName = x.Reviewer.DisplayName,
WriterId = x.ReviewerId,
}).ToList();
return Ok(result);
}
[HttpGet]
[Route("Sellers/{sellerId:int}/Services/{serviceId:int}/Reviews/Count")]
public async Task<IActionResult> GetSellerServiceReviewsCount(int sellerId, int serviceId)
{
var seller = await _dbContext.UserSellerProfiles
.Include(x=>x.User)
.FirstOrDefaultAsync(x=>x.Id==sellerId);
if(seller==null)
return NotFound("Seller not found.");
var sellerService = await _dbContext.SellerServices
.Include(x=>x.Reviews).ThenInclude(x=>x.Reviewer)
.FirstOrDefaultAsync(x=>x.Id==serviceId);
if(sellerService==null)
return NotFound("Seller service not found.");
var result = sellerService.Reviews.Count;
return Ok(result);
}
}

View File

@ -0,0 +1,333 @@
using ArtPlatform.API.Extensions;
using ArtPlatform.API.Models.Order;
using ArtPlatform.API.Services.Storage;
using ArtPlatform.Database;
using ArtPlatform.Database.Entities;
using ArtPlatform.Database.Enums;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
namespace ArtPlatform.API.Controllers;
[ApiController]
[Route("api/[controller]")]
public class OrderController : Controller
{
private readonly ApplicationDbContext _dbContext;
private readonly IStorage _storage;
public OrderController(ApplicationDbContext dbContext, IStorage storage)
{
_storage = storage;
_dbContext = dbContext;
}
[HttpGet]
[Route("Orders")]
[Authorize("read:orders")]
public async Task<IActionResult> GetOrders(int offset = 0, int pageSize = 10, EnumOrderStatus? status = null)
{
var userId = User.GetUserId();
var orders = await _dbContext.SellerServiceOrders
.Where(x => x.BuyerId == userId && status==null ? true : status==x.Status)
.Skip(offset).Take(pageSize).ToListAsync();
var result = orders.Select(x => x.ToModel()).ToList();
return Ok(result);
}
[HttpPost]
[Route("Sellers/{sellerId:int}/Services/{serviceId:int}")]
[Authorize("write:orders")]
public async Task<IActionResult> CreateOrder(int sellerId, int serviceId)
{
var userId = User.GetUserId();
var seller = await _dbContext.UserSellerProfiles
.Include(x=>x.User)
.FirstOrDefaultAsync(x=>x.Id==sellerId);
if(seller==null)
return NotFound("Seller not found.");
var service = await _dbContext.SellerServices
.Include(x=>x.Reviews)
.FirstOrDefaultAsync(x=>x.Id==serviceId);
if(service==null)
return NotFound("Service not found.");
if(_dbContext.SellerServiceOrders.Where(x=>x.BuyerId==userId && x.Status!=EnumOrderStatus.Completed && x.Status!=EnumOrderStatus.Cancelled).Count()>=3)
return BadRequest("You already have an order in progress. There is a limit of three at a time.");
var order = new SellerServiceOrder()
{
BuyerId = userId,
SellerId = seller.Id,
SellerServiceId = serviceId,
Status = EnumOrderStatus.PendingAcceptance,
CreatedDate = DateTime.UtcNow,
Price = service.Price,
SellerService = service,
Buyer = await _dbContext.Users.FirstOrDefaultAsync(x=>x.Id==userId),
};
order = _dbContext.SellerServiceOrders.Add(order).Entity;
await _dbContext.SaveChangesAsync();
var result = order.ToModel();
return Ok(result);
}
[HttpDelete]
[Authorize("write:orders")]
[Route("Orders/{orderId:int}")]
public async Task<IActionResult> CancelOrder(int orderId)
{
var userId = User.GetUserId();
var order = await _dbContext.SellerServiceOrders
.Include(x=>x.SellerService)
.FirstOrDefaultAsync(x=>x.Id==orderId && x.BuyerId==userId);
if(order==null)
return NotFound("Order not found.");
if(order.BuyerId!=userId)
return BadRequest("You are not the buyer of this order.");
if(order.Status==EnumOrderStatus.Completed)
return BadRequest("Order is not in a cancellable state.");
order.Status = EnumOrderStatus.Cancelled;
order.EndDate = DateTime.UtcNow;
order = _dbContext.SellerServiceOrders.Update(order).Entity;
await _dbContext.SaveChangesAsync();
var result = order.ToModel();
return Ok(result);
}
[HttpPut]
[Authorize("write:orders")]
[Route("Orders/{orderId:int}/AcceptPrice")]
public async Task<IActionResult> AcceptPrice(int orderId)
{
var userId = User.GetUserId();
var order = await _dbContext.SellerServiceOrders
.Include(x=>x.SellerService)
.Include(x=>x.Seller)
.FirstOrDefaultAsync(x=>x.Id==orderId && x.BuyerId==userId);
if(order==null)
return NotFound("Order not found.");
if(order.Seller.UserId!=userId)
return BadRequest("You are not the seller of this order.");
if(order.Status==EnumOrderStatus.Completed)
return BadRequest("Order is already complete.");
if(order.Status<EnumOrderStatus.DiscussingRequirements)
return BadRequest("Order has not been started yet.");
order.Status = EnumOrderStatus.InProgress;
order.TermsAcceptedDate = DateTime.UtcNow;
order = _dbContext.SellerServiceOrders.Update(order).Entity;
await _dbContext.SaveChangesAsync();
var result = order.ToModel();
return Ok(result);
}
[HttpPut]
[Authorize("write:orders")]
[Route("Orders/{orderId:int}/Accept")]
public async Task<IActionResult> Accept(int orderId)
{
var userId = User.GetUserId();
var order = await _dbContext.SellerServiceOrders
.Include(x=>x.Seller)
.Include(x=>x.SellerService)
.FirstOrDefaultAsync(x=>x.Id==orderId && x.BuyerId==userId);
if(order==null)
return NotFound("Order not found.");
if(order.Seller.UserId!=userId)
return BadRequest("You are not the seller of this order.");
if(order.Status==EnumOrderStatus.Completed)
return BadRequest("Order is already complete.");
if(order.Status<EnumOrderStatus.InProgress)
return BadRequest("Order has not been started yet.");
if(order.Status<EnumOrderStatus.PendingReview)
return BadRequest("Order is in progress and not pending review.");
order.Status = EnumOrderStatus.Completed;
order.TermsAcceptedDate = DateTime.UtcNow;
order = _dbContext.SellerServiceOrders.Update(order).Entity;
await _dbContext.SaveChangesAsync();
var result = order.ToModel();
return Ok(result);
}
[HttpDelete]
[Authorize("write:orders")]
[Route("Orders/{orderId:int}/Deny")]
public async Task<IActionResult> Deny(int orderId)
{
var userId = User.GetUserId();
var order = await _dbContext.SellerServiceOrders
.Include(x=>x.Seller)
.Include(x=>x.SellerService)
.FirstOrDefaultAsync(x=>x.Id==orderId && x.BuyerId==userId);
if(order==null)
return NotFound("Order not found.");
if(order.Seller.UserId!=userId)
return BadRequest("You are not the seller of this order.");
if(order.Status==EnumOrderStatus.Completed)
return BadRequest("Order is already complete.");
if(order.Status<EnumOrderStatus.InProgress)
return BadRequest("Order has not been started yet.");
if(order.Status<EnumOrderStatus.PendingReview)
return BadRequest("Order is in progress and not pending review.");
order.Status = EnumOrderStatus.InProgress;
order.TermsAcceptedDate = DateTime.UtcNow;
order = _dbContext.SellerServiceOrders.Update(order).Entity;
await _dbContext.SaveChangesAsync();
var result = order.ToModel();
return Ok(result);
}
[HttpPost]
[Authorize("write:orders")]
[Route("Orders/{orderId:int}/Review")]
public async Task<IActionResult> Review(int orderId, [FromBody] SellerServiceOrderReviewModel model)
{
var userId = User.GetUserId();
var order = await _dbContext.SellerServiceOrders
.Include(x=>x.Reviews)
.Include(x=>x.Seller)
.Include(x=>x.SellerService)
.FirstOrDefaultAsync(x=>x.Id==orderId && x.BuyerId==userId);
if(order==null)
return NotFound("Order not found.");
if(order.BuyerId!=userId)
return BadRequest("You are not the buyer of this order.");
if(order.Status!=EnumOrderStatus.Completed)
return BadRequest("Order is not complete.");
if(order.Reviews.Any(x=>x.SellerServiceOrderId==orderId))
return BadRequest("Order has already been reviewed.");
var review = new SellerServiceOrderReview()
{
SellerServiceOrderId = orderId,
SellerServiceId = order.SellerServiceId,
Rating = model.Rating,
Review = model.Review,
ReviewDate = DateTime.UtcNow,
ReviewerId = userId,
Reviewer = await _dbContext.Users.FirstOrDefaultAsync(x=>x.Id==userId),
};
await _dbContext.SellerServiceOrderReviews.AddAsync(review);
await _dbContext.SaveChangesAsync();
return Ok();
}
[HttpGet]
[Authorize("read:orders")]
[Route("Orders/{orderId:int}/Messages")]
public async Task<IActionResult> GetMessages(int orderId, int offset = 0, int pageSize = 10)
{
var userId = User.GetUserId();
var order = await _dbContext.SellerServiceOrders
.Include(x=>x.Seller)
.FirstOrDefaultAsync(x=>x.Id==orderId && x.BuyerId==userId);
if(order==null)
return NotFound("Order not found.");
if(order.BuyerId!=userId && order.Seller.UserId!=userId)
return BadRequest("You are not the buyer or seller of this order.");
var messages = _dbContext.SellerServiceOrderMessages
.Include(x=>x.Sender)
.Include(x=>x.Attachments)
.OrderBy(x=>x.SentAt)
.Where(x=>x.SellerServiceOrderId==orderId)
.Skip(offset).Take(pageSize).ToList();
var result = messages.Select(x=>x.ToModel()).ToList();
return Ok(result);
}
[HttpPost]
[Authorize("write:orders")]
[Route("Orders/{orderId:int}/Message")]
public async Task<IActionResult> Message(int orderId, [FromBody] SellerServiceOrderMessageModel model)
{
var userId = User.GetUserId();
var order = await _dbContext.SellerServiceOrders
.Include(x=>x.Messages)
.Include(x=>x.Seller)
.Include(x=>x.SellerService)
.FirstOrDefaultAsync(x=>x.Id==orderId && x.BuyerId==userId);
if(order==null)
return NotFound("Order not found.");
if(order.Status==EnumOrderStatus.Completed || order.Status==EnumOrderStatus.Cancelled)
return BadRequest("Order is already complete.");
if(order.BuyerId!=userId && order.Seller.UserId!=userId)
return BadRequest("You are not the buyer or seller of this order.");
if(order.Status<EnumOrderStatus.Waitlist)
return BadRequest("Order is not accepted.");
var message = new SellerServiceOrderMessage()
{
SellerServiceOrderId = orderId,
Message = model.Message,
SentAt = DateTime.UtcNow,
SenderId = userId,
Sender = await _dbContext.Users.FirstOrDefaultAsync(x=>x.Id==userId),
};
var dbMessage = _dbContext.SellerServiceOrderMessages.Add(message).Entity;
await _dbContext.SaveChangesAsync();
return Ok();
}
[HttpPost]
[Authorize("write:orders")]
[Route("Orders/{orderId:int}/Message/{messageId:int}/Attachment")]
public async Task<IActionResult> MessageAttachment(int orderId, int messageId,IFormFile file)
{
var userId = User.GetUserId();
var order = await _dbContext.SellerServiceOrders
.Include(x=>x.Messages)
.Include(x=>x.Seller)
.Include(x=>x.SellerService)
.FirstOrDefaultAsync(x=>x.Id==orderId);
if(order==null)
return NotFound("Order not found.");
if(order.BuyerId!=userId && order.Seller.UserId!=userId)
return BadRequest("You are not the buyer or seller of this order.");
if(order.Status==EnumOrderStatus.Completed || order.Status==EnumOrderStatus.Cancelled)
return BadRequest("Order is already complete.");
if(order.Status<EnumOrderStatus.Waitlist)
return BadRequest("Order is not accepted.");
var message = _dbContext.SellerServiceOrderMessages.First(x=>x.Id==messageId && x.SellerServiceOrderId==orderId);
if(message==null)
return BadRequest("Message does not exist or does not belong to this order.");
var url = await _storage.UploadImageAsync(file, Guid.NewGuid().ToString());
var attachment = new SellerServiceOrderMessageAttachment()
{
SellerServiceOrderMessageId = message.Id,
FileReference = url
};
_dbContext.SellerServiceOrderMessageAttachments.Add(attachment);
await _dbContext.SaveChangesAsync();
return Ok();
}
[HttpGet]
[Authorize("read:orders")]
[Route("Orders/{orderId:int}/Message/{messageId:int}/Attachment")]
public async Task<IActionResult> MessageAttachments(int orderId, int messageId)
{
var userId = User.GetUserId();
var order = await _dbContext.SellerServiceOrders
.Include(x=>x.Messages)
.Include(x=>x.Seller)
.Include(x=>x.SellerService)
.FirstOrDefaultAsync(x=>x.Id==orderId);
if(order==null)
return NotFound("Order not found.");
if(order.BuyerId!=userId && order.Seller.UserId!=userId)
return BadRequest("You are not the buyer or seller of this order.");
if(order.Status==EnumOrderStatus.Completed || order.Status==EnumOrderStatus.Cancelled)
return BadRequest("Order is already complete.");
if(order.Status<EnumOrderStatus.Waitlist)
return BadRequest("Order is not accepted.");
var message = _dbContext.SellerServiceOrderMessages.Include(x=>x.Attachments)
.First(x=>x.Id==messageId && x.SellerServiceOrderId==orderId);
if(message==null)
return BadRequest("Message does not exist or does not belong to this order.");
var content = await _storage.DownloadImageAsync(message.Attachments.First().FileReference);
return new FileStreamResult(content, "application/octet-stream");
}
}

View File

@ -0,0 +1,285 @@
using ArtPlatform.API.Extensions;
using ArtPlatform.API.Models.Order;
using ArtPlatform.API.Services.Storage;
using ArtPlatform.Database;
using ArtPlatform.Database.Entities;
using ArtPlatform.Database.Enums;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
namespace ArtPlatform.API.Controllers;
[ApiController]
[Route("api/[controller]")]
public class SellerOrderController : Controller
{
private readonly ApplicationDbContext _dbContext;
private readonly IStorage _storage;
public SellerOrderController(IStorage storage, ApplicationDbContext dbContext)
{
_storage = storage;
_dbContext = dbContext;
}
[HttpGet]
[Route("Orders")]
[Authorize("read:seller-orders")]
public async Task<IActionResult> GetOrders(int offset = 0, int pageSize = 10, EnumOrderStatus? status = null)
{
var userId = User.GetUserId();
var orders = await _dbContext.SellerServiceOrders
.Include(x=>x.Seller)
.Where(x => x.Seller.UserId == userId && status==null ? true : status==x.Status)
.Skip(offset).Take(pageSize).ToListAsync();
var result = orders.Select(x => x.ToModel()).ToList();
return Ok(result);
}
[HttpDelete]
[Authorize("write:seller-orders")]
[Route("Orders/{orderId:int}/Cancel")]
public async Task<IActionResult> CancelOrder(int orderId)
{
var userId = User.GetUserId();
var order = await _dbContext.SellerServiceOrders
.Include(x=>x.SellerService)
.FirstOrDefaultAsync(x=>x.Id==orderId && x.Seller.UserId==userId);
if(order==null)
return NotFound("Order not found.");
if(order.Status==EnumOrderStatus.Completed || order.Status== EnumOrderStatus.Cancelled)
return BadRequest("Order is already complete.");
if(order.BuyerId!=userId)
return BadRequest("You are not the buyer of this order.");
if(order.Status!=EnumOrderStatus.Completed && order.Status!= EnumOrderStatus.Cancelled)
return BadRequest("Order is not in a cancellable state.");
order.Status = EnumOrderStatus.Cancelled;
order.EndDate = DateTime.UtcNow;
order = _dbContext.SellerServiceOrders.Update(order).Entity;
await _dbContext.SaveChangesAsync();
var result = order.ToModel();
return Ok(result);
}
[HttpPut]
[Authorize("write:seller-orders")]
[Route("Orders/{orderId:int}/Accept")]
public async Task<IActionResult> AcceptOrder(int orderId)
{
var userId = User.GetUserId();
var order = await _dbContext.SellerServiceOrders
.Include(x=>x.SellerService)
.FirstOrDefaultAsync(x=>x.Id==orderId && x.Seller.UserId==userId);
if(order==null)
return NotFound("Order not found.");
if(order.Status==EnumOrderStatus.Completed || order.Status== EnumOrderStatus.Cancelled)
return BadRequest("Order is already complete.");
if(order.BuyerId!=userId)
return BadRequest("You are not the buyer of this order.");
if(order.Status!=EnumOrderStatus.PendingAcceptance)
return BadRequest("Order has already been accepted.");
order.Status = EnumOrderStatus.Waitlist;
order = _dbContext.SellerServiceOrders.Update(order).Entity;
await _dbContext.SaveChangesAsync();
var result = order.ToModel();
return Ok(result);
}
[HttpPut]
[Authorize("write:seller-orders")]
[Route("Orders/{orderId:int}/Start")]
public async Task<IActionResult> StartOrder(int orderId)
{
var userId = User.GetUserId();
var order = await _dbContext.SellerServiceOrders
.Include(x=>x.SellerService)
.FirstOrDefaultAsync(x=>x.Id==orderId && x.Seller.UserId==userId);
if(order==null)
return NotFound("Order not found.");
if(order.Status==EnumOrderStatus.Completed || order.Status== EnumOrderStatus.Cancelled)
return BadRequest("Order is already complete.");
if(order.BuyerId!=userId)
return BadRequest("You are not the buyer of this order.");
if(order.Status!=EnumOrderStatus.Waitlist)
return BadRequest("Order has already been started.");
order.Status = EnumOrderStatus.DiscussingRequirements;
order = _dbContext.SellerServiceOrders.Update(order).Entity;
await _dbContext.SaveChangesAsync();
var result = order.ToModel();
return Ok(result);
}
[HttpPut]
[Authorize("write:seller-orders")]
[Route("Orders/{orderId:int}/AdjustPrice")]
public async Task<IActionResult> AdjustPrice(int orderId,[FromQuery]double price)
{
var userId = User.GetUserId();
var order = await _dbContext.SellerServiceOrders
.Include(x=>x.Seller)
.Include(x=>x.SellerService)
.FirstOrDefaultAsync(x=>x.Id==orderId && x.Seller.UserId==userId);
if(order==null)
return NotFound("Order not found.");
if(order.Seller.UserId!=userId)
return BadRequest("You are not the seller of this order.");
if(order.Status==EnumOrderStatus.Completed || order.Status== EnumOrderStatus.Cancelled)
return BadRequest("Order is already complete.");
if(order.Status>EnumOrderStatus.DiscussingRequirements)
return BadRequest("Order requirements and price have already been confirmed.");
if(order.Status<EnumOrderStatus.DiscussingRequirements)
return BadRequest("Order has not been started.");
order.Price = price;
order = _dbContext.SellerServiceOrders.Update(order).Entity;
await _dbContext.SaveChangesAsync();
var result = order.ToModel();
return Ok(result);
}
[HttpPut]
[Authorize("write:seller-orders")]
[Route("Orders/{orderId:int}/CompleteRevision")]
public async Task<IActionResult> CompleteRevision(int orderId)
{
var userId = User.GetUserId();
var order = await _dbContext.SellerServiceOrders
.Include(x=>x.Seller)
.Include(x=>x.SellerService)
.FirstOrDefaultAsync(x=>x.Id==orderId && x.Seller.UserId==userId);
if(order==null)
return NotFound("Order not found.");
if(order.Seller.UserId!=userId)
return BadRequest("You are not the seller of this order.");
if(order.Status==EnumOrderStatus.Completed || order.Status== EnumOrderStatus.Cancelled)
return BadRequest("Order is already complete.");
if(order.Status<EnumOrderStatus.InProgress)
return BadRequest("Order has not been started.");
if(order.Status>EnumOrderStatus.InProgress)
return BadRequest("Order is pending review already.");
order.Status = EnumOrderStatus.PendingReview;
order = _dbContext.SellerServiceOrders.Update(order).Entity;
await _dbContext.SaveChangesAsync();
var result = order.ToModel();
return Ok(result);
}
[HttpGet]
[Authorize("read:orders")]
[Route("Orders/{orderId:int}/Messages")]
public async Task<IActionResult> GetMessages(int orderId, int offset = 0, int pageSize = 10)
{
var userId = User.GetUserId();
var order = await _dbContext.SellerServiceOrders
.Include(x=>x.Seller)
.FirstOrDefaultAsync(x=>x.Id==orderId && x.Seller.UserId==userId);
if(order==null)
return NotFound("Order not found.");
if(order.BuyerId!=userId && order.Seller.UserId!=userId)
return BadRequest("You are not the buyer or seller of this order.");
var messages = _dbContext.SellerServiceOrderMessages
.Include(x=>x.Sender)
.Include(x=>x.Attachments)
.OrderBy(x=>x.SentAt)
.Where(x=>x.SellerServiceOrderId==orderId)
.Skip(offset).Take(pageSize).ToList();
var result = messages.Select(x=>x.ToModel()).ToList();
return Ok(result);
}
[HttpPost]
[Authorize("write:orders")]
[Route("Orders/{orderId:int}/Message")]
public async Task<IActionResult> Message(int orderId, [FromBody] SellerServiceOrderMessageModel model)
{
var userId = User.GetUserId();
var order = await _dbContext.SellerServiceOrders
.Include(x=>x.Messages)
.Include(x=>x.Seller)
.Include(x=>x.SellerService)
.FirstOrDefaultAsync(x=>x.Id==orderId && x.Seller.UserId==userId);
if(order==null)
return NotFound("Order not found.");
if(order.Status==EnumOrderStatus.Completed || order.Status==EnumOrderStatus.Cancelled)
return BadRequest("Order is already complete.");
if(order.BuyerId!=userId && order.Seller.UserId!=userId)
return BadRequest("You are not the buyer or seller of this order.");
if(order.Status<EnumOrderStatus.Waitlist)
return BadRequest("Order is not accepted.");
var message = new SellerServiceOrderMessage()
{
SellerServiceOrderId = orderId,
Message = model.Message,
SentAt = DateTime.UtcNow,
SenderId = userId,
Sender = await _dbContext.Users.FirstOrDefaultAsync(x=>x.Id==userId),
};
var dbMessage = _dbContext.SellerServiceOrderMessages.Add(message).Entity;
await _dbContext.SaveChangesAsync();
return Ok();
}
[HttpPost]
[Authorize("write:orders")]
[Route("Orders/{orderId:int}/Message/{messageId:int}/Attachment")]
public async Task<IActionResult> MessageAttachment(int orderId, int messageId,IFormFile file)
{
var userId = User.GetUserId();
var order = await _dbContext.SellerServiceOrders
.Include(x=>x.Messages)
.Include(x=>x.Seller)
.Include(x=>x.SellerService)
.FirstOrDefaultAsync(x=>x.Id==orderId && x.Seller.UserId==userId);
if(order==null)
return NotFound("Order not found.");
if(order.BuyerId!=userId && order.Seller.UserId!=userId)
return BadRequest("You are not the buyer or seller of this order.");
if(order.Status==EnumOrderStatus.Completed || order.Status==EnumOrderStatus.Cancelled)
return BadRequest("Order is already complete.");
if(order.Status<EnumOrderStatus.Waitlist)
return BadRequest("Order is not accepted.");
var message = _dbContext.SellerServiceOrderMessages.First(x=>x.Id==messageId && x.SellerServiceOrderId==orderId);
if(message==null)
return BadRequest("Message does not exist or does not belong to this order.");
var url = await _storage.UploadImageAsync(file, Guid.NewGuid().ToString());
var attachment = new SellerServiceOrderMessageAttachment()
{
SellerServiceOrderMessageId = message.Id,
FileReference = url
};
_dbContext.SellerServiceOrderMessageAttachments.Add(attachment);
await _dbContext.SaveChangesAsync();
return Ok();
}
[HttpGet]
[Authorize("read:orders")]
[Route("Orders/{orderId:int}/Message/{messageId:int}/Attachment")]
public async Task<IActionResult> MessageAttachments(int orderId, int messageId)
{
var userId = User.GetUserId();
var order = await _dbContext.SellerServiceOrders
.Include(x=>x.Messages)
.Include(x=>x.Seller)
.Include(x=>x.SellerService)
.FirstOrDefaultAsync(x=>x.Id==orderId);
if(order==null)
return NotFound("Order not found.");
if(order.BuyerId!=userId && order.Seller.UserId!=userId)
return BadRequest("You are not the buyer or seller of this order.");
if(order.Status==EnumOrderStatus.Completed || order.Status==EnumOrderStatus.Cancelled)
return BadRequest("Order is already complete.");
if(order.Status<EnumOrderStatus.Waitlist)
return BadRequest("Order is not accepted.");
var message = _dbContext.SellerServiceOrderMessages.Include(x=>x.Attachments)
.First(x=>x.Id==messageId && x.SellerServiceOrderId==orderId);
if(message==null)
return BadRequest("Message does not exist or does not belong to this order.");
var attachment = message.Attachments.FirstOrDefault();
if(attachment==null)
return BadRequest("Message does not have an attachment.");
var content = await _storage.DownloadImageAsync(message.Attachments.First().FileReference);
return new FileStreamResult(content, "application/octet-stream");
}
}

View File

@ -0,0 +1,181 @@
using ArtPlatform.API.Extensions;
using ArtPlatform.API.Models.PortfolioModel;
using ArtPlatform.API.Models.SellerProfile;
using ArtPlatform.API.Services.Storage;
using ArtPlatform.Database;
using ArtPlatform.Database.Entities;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
namespace ArtPlatform.API.Controllers;
[ApiController]
[Route("api/[controller]")]
public class SellerProfileController : Controller
{
private readonly ApplicationDbContext _dbContext;
private readonly IStorage _storage;
public SellerProfileController(ApplicationDbContext dbContext, IStorage storage)
{
_storage = storage;
_dbContext = dbContext;
}
[HttpGet]
[Authorize("read:seller-profile")]
public async Task<IActionResult> GetSellerProfile()
{
var userId = User.GetUserId();
var sellerProfile = await _dbContext.UserSellerProfiles.FirstOrDefaultAsync(sellerProfile=>sellerProfile.UserId==userId);
if(sellerProfile==null)
{
var sellerProfileRequest = await _dbContext.SellerProfileRequests.FirstOrDefaultAsync(request=>request.UserId==userId && request.Accepted==false);
if(sellerProfileRequest!=null)
return BadRequest("Account has requested to be a seller and not been approved yet.");
return Unauthorized("Account is not a seller.");
}
var result = sellerProfile.ToModel();
return Ok(result);
}
[HttpPut]
[Authorize("write:seller-profile")]
public async Task<IActionResult> UpdateSellerProfile(SellerProfileModel model)
{
var userId = User.GetUserId();
var existingSellerProfile = await _dbContext.UserSellerProfiles.FirstOrDefaultAsync(sellerProfile=>sellerProfile.UserId==userId);
if (existingSellerProfile == null)
{
var sellerProfileRequest = await _dbContext.SellerProfileRequests.FirstOrDefaultAsync(request=>request.UserId==userId && request.Accepted==false);
if(sellerProfileRequest!=null)
return BadRequest("Account has requested to be a seller and not been approved yet.");
return Unauthorized("Account is not a seller.");
}
var updatedSellerProfile = model.ToModel(existingSellerProfile);
updatedSellerProfile = _dbContext.UserSellerProfiles.Update(updatedSellerProfile).Entity;
await _dbContext.SaveChangesAsync();
var result = updatedSellerProfile.ToModel();
return Ok(result);
}
[HttpPost]
[Authorize("write:seller-profile")]
public async Task<IActionResult> RequestSellerProfile(SellerProfileModel model)
{
var userId = User.GetUserId();
var existingSellerProfile = await _dbContext.UserSellerProfiles.FirstOrDefaultAsync(sellerProfile=>sellerProfile.UserId==userId);
if (existingSellerProfile != null)
{
return Unauthorized("Account is already a seller.");
}
var sellerProfileRequest = await _dbContext.SellerProfileRequests.FirstOrDefaultAsync(request=>request.UserId==userId);
if(sellerProfileRequest!=null)
return BadRequest("Account has already requested to be a seller.");
sellerProfileRequest = new SellerProfileRequest()
{
Accepted = false,
RequestDate = DateTime.UtcNow,
UserId = userId
};
_dbContext.SellerProfileRequests.Add(sellerProfileRequest);
await _dbContext.SaveChangesAsync();
return Ok();
}
[HttpGet]
[Authorize("read:seller-profile")]
[Route("{sellerServiceId:int}/Portfolio/{portfolioId:int}")]
public async Task<IActionResult> GetPortfolio(int sellerServiceId, int portfolioId)
{
var userId = User.GetUserId();
var existingSellerProfile = await _dbContext.UserSellerProfiles.FirstOrDefaultAsync(sellerProfile=>sellerProfile.UserId==userId);
if (existingSellerProfile == null)
{
var sellerProfileRequest = await _dbContext.SellerProfileRequests.FirstOrDefaultAsync(request=>request.UserId==userId && request.Accepted==false);
if(sellerProfileRequest!=null)
return BadRequest("Account has requested to be a seller and not been approved yet.");
return Unauthorized("Account is not a seller.");
}
var portfolio = await _dbContext.SellerProfilePortfolioPieces
.FirstAsync(x => x.SellerProfileId == existingSellerProfile.Id && x.Id==portfolioId);
var content = await _storage.DownloadImageAsync(portfolio.FileReference);
return new FileStreamResult(content, "application/octet-stream");
}
[HttpGet]
[Route("Portfolio")]
[Authorize("read:seller-profile")]
public async Task<IActionResult> GetPortfolio()
{
var userId = User.GetUserId();
var existingSellerProfile = await _dbContext.UserSellerProfiles.FirstOrDefaultAsync(sellerProfile=>sellerProfile.UserId==userId);
if (existingSellerProfile == null)
{
var sellerProfileRequest = await _dbContext.SellerProfileRequests.FirstOrDefaultAsync(request=>request.UserId==userId && request.Accepted==false);
if(sellerProfileRequest!=null)
return BadRequest("Account has requested to be a seller and not been approved yet.");
return Unauthorized("Account is not a seller.");
}
var portfolio = await _dbContext.SellerProfilePortfolioPieces.Where(x=>x.SellerProfileId==existingSellerProfile.Id).ToListAsync();
var result = portfolio.Select(x=>x.ToModel()).ToList();
return Ok(result);
}
[HttpPost]
[Route("Portfolio")]
[Authorize("write:seller-profile")]
public async Task<IActionResult> AddPortfolio(IFormFile file)
{
var userId = User.GetUserId();
var existingSellerProfile = await _dbContext.UserSellerProfiles.FirstOrDefaultAsync(sellerProfile=>sellerProfile.UserId==userId);
if (existingSellerProfile == null)
{
var sellerProfileRequest = await _dbContext.SellerProfileRequests.FirstOrDefaultAsync(request=>request.UserId==userId && request.Accepted==false);
if(sellerProfileRequest!=null)
return BadRequest("Account has requested to be a seller and not been approved yet.");
return Unauthorized("Account is not a seller.");
}
var url = await _storage.UploadImageAsync(file, Guid.NewGuid().ToString());
var portfolio = new SellerProfilePortfolioPiece()
{
SellerProfileId = existingSellerProfile.Id,
FileReference = url
};
portfolio.SellerProfileId = existingSellerProfile.Id;
_dbContext.SellerProfilePortfolioPieces.Add(portfolio);
await _dbContext.SaveChangesAsync();
var result = portfolio.ToModel();
return Ok(result);
}
[HttpDelete]
[Authorize("write:seller-profile")]
[Route("Portfolio/{portfolioId:int}")]
public async Task<IActionResult> DeletePortfolio(int portfolioId)
{
var userId = User.GetUserId();
var existingSellerProfile = await _dbContext.UserSellerProfiles.FirstOrDefaultAsync(sellerProfile=>sellerProfile.UserId==userId);
if (existingSellerProfile == null)
{
var sellerProfileRequest = await _dbContext.SellerProfileRequests.FirstOrDefaultAsync(request=>request.UserId==userId && request.Accepted==false);
if(sellerProfileRequest!=null)
return BadRequest("Account has requested to be a seller and not been approved yet.");
return Unauthorized("Account is not a seller.");
}
var portfolio = await _dbContext.SellerProfilePortfolioPieces.FirstOrDefaultAsync(x=>x.Id==portfolioId);
if(portfolio==null)
return NotFound("Portfolio piece not found.");
if(portfolio.SellerProfileId!=existingSellerProfile.Id)
return BadRequest("Portfolio piece does not belong to this seller.");
_dbContext.SellerProfilePortfolioPieces.Remove(portfolio);
await _dbContext.SaveChangesAsync();
return Ok();
}
}

View File

@ -0,0 +1,222 @@
using ArtPlatform.API.Extensions;
using ArtPlatform.API.Models.PortfolioModel;
using ArtPlatform.API.Models.SellerService;
using ArtPlatform.API.Services.Storage;
using ArtPlatform.Database;
using ArtPlatform.Database.Entities;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
namespace ArtPlatform.API.Controllers;
[ApiController]
[Route("api/[controller]")]
public class SellerServiceController : Controller
{
private readonly ApplicationDbContext _dbContext;
private readonly IStorage _storage;
public SellerServiceController(ApplicationDbContext dbContext, IStorage storage)
{
_storage = storage;
_dbContext = dbContext;
}
[HttpGet]
[Authorize("read:seller-service")]
public async Task<IActionResult> GetSellerServices(int offset=0, int pageSize=10)
{
var userId = User.GetUserId();
var seller = await _dbContext.UserSellerProfiles.FirstOrDefaultAsync(sellerProfile=>sellerProfile.UserId==userId);
if(seller==null)
return BadRequest("Account is not a seller.");
var sellerServices = await _dbContext.SellerServices.Include(x=>x.Reviews)
.Skip(offset).Take(pageSize).ToListAsync();
var result = sellerServices.Select(x=>x.ToModel()).ToList();
return Ok(result);
}
[HttpGet]
[Route("Count")]
[Authorize("read:seller-service")]
public async Task<IActionResult> GetSellerServicesCount()
{
var userId = User.GetUserId();
var seller = await _dbContext.UserSellerProfiles.FirstOrDefaultAsync(sellerProfile=>sellerProfile.UserId==userId);
if(seller==null)
return BadRequest("Account is not a seller.");
var sellerServices = await _dbContext.SellerServices.Include(x => x.Reviews).ToListAsync();
var result = sellerServices.Count;
return Ok(result);
}
[HttpPost]
[Authorize("write:seller-service")]
public async Task<IActionResult> CreateSellerService([FromBody] SellerServiceCreateModel model)
{
var userId = User.GetUserId();
var seller = await _dbContext.UserSellerProfiles.FirstOrDefaultAsync(sellerProfile=>sellerProfile.UserId==userId);
if(seller==null)
return BadRequest("Account is not a seller.");
var sellerService = new Database.Entities.SellerService()
{
Name = model.Name,
Description = model.Description,
Price = model.Price,
SellerProfileId = seller.Id
};
sellerService = _dbContext.SellerServices.Add(sellerService).Entity;
await _dbContext.SaveChangesAsync();
var result = sellerService.ToModel();
return Ok(result);
}
[HttpPut]
[Authorize("write:seller-service")]
[Route("{sellerServiceId:int}")]
public async Task<IActionResult> UpdateSellerService([FromBody] SellerServiceUpdateModel model, int sellerServiceId)
{
var userId = User.GetUserId();
var seller = await _dbContext.UserSellerProfiles.FirstOrDefaultAsync(sellerProfile=>sellerProfile.UserId==userId);
if(seller==null)
return BadRequest("Account is not a seller.");
var sellerService = await _dbContext.SellerServices.FirstOrDefaultAsync(sellerService=>sellerService.Id==sellerServiceId);
if(sellerService==null)
return NotFound("Seller service not found.");
sellerService.Name = model.Name;
sellerService.Description = model.Description;
sellerService.Price = model.Price;
sellerService = _dbContext.SellerServices.Update(sellerService).Entity;
await _dbContext.SaveChangesAsync();
var result = sellerService.ToModel();
return Ok(result);
}
[HttpDelete]
[Authorize("write:seller-service")]
[Route("{sellerServiceId:int}")]
public async Task<IActionResult> DeleteSellerService(int sellerServiceId)
{
var userId = User.GetUserId();
var seller = await _dbContext.UserSellerProfiles.FirstOrDefaultAsync(sellerProfile=>sellerProfile.UserId==userId);
if(seller==null)
return BadRequest("Account is not a seller.");
var sellerService = await _dbContext.SellerServices.FirstOrDefaultAsync(sellerService=>sellerService.Id==sellerServiceId);
if(sellerService==null)
return NotFound("Seller service not found.");
_dbContext.SellerServices.Remove(sellerService);
await _dbContext.SaveChangesAsync();
return Ok();
}
[HttpGet]
[Route("{sellerServiceId:int}/Portfolio/")]
public async Task<IActionResult> GetPortfolio(int sellerServiceId)
{
var userId = User.GetUserId();
var existingSellerProfile = await _dbContext.UserSellerProfiles.FirstOrDefaultAsync(sellerProfile=>sellerProfile.UserId==userId);
if (existingSellerProfile == null)
{
var sellerProfileRequest = await _dbContext.SellerProfileRequests.FirstOrDefaultAsync(request=>request.UserId==userId && request.Accepted==false);
if(sellerProfileRequest!=null)
return BadRequest("Account has requested to be a seller and not been approved yet.");
return Unauthorized("Account is not a seller.");
}
var portfolio = await _dbContext.SellerProfilePortfolioPieces.Where(x=>x.SellerProfileId==existingSellerProfile.Id && x.SellerServiceId==sellerServiceId).ToListAsync();
var result = portfolio.Select(x=>x.ToModel()).ToList();
return Ok(result);
}
[HttpGet]
[Authorize("read:seller-service")]
[Route("{sellerServiceId:int}/Portfolio/{portfolioId:int}")]
public async Task<IActionResult> GetPortfolio(int sellerServiceId, int portfolioId)
{
var userId = User.GetUserId();
var existingSellerProfile = await _dbContext.UserSellerProfiles.FirstOrDefaultAsync(sellerProfile=>sellerProfile.UserId==userId);
if (existingSellerProfile == null)
{
var sellerProfileRequest = await _dbContext.SellerProfileRequests.FirstOrDefaultAsync(request=>request.UserId==userId && request.Accepted==false);
if(sellerProfileRequest!=null)
return BadRequest("Account has requested to be a seller and not been approved yet.");
return Unauthorized("Account is not a seller.");
}
var portfolio = await _dbContext.SellerProfilePortfolioPieces
.FirstAsync(x => x.SellerProfileId == existingSellerProfile.Id
&& x.SellerServiceId == sellerServiceId && x.Id==portfolioId);
var content = await _storage.DownloadImageAsync(portfolio.FileReference);
return new FileStreamResult(content, "application/octet-stream");
}
[HttpPost]
[Authorize("write:seller-service")]
[Route("{sellerServiceId:int}/Portfolio")]
public async Task<IActionResult> AddPortfolio(IFormFile file, int sellerServiceId)
{
var userId = User.GetUserId();
var existingSellerProfile = await _dbContext.UserSellerProfiles.FirstOrDefaultAsync(sellerProfile=>sellerProfile.UserId==userId);
if (existingSellerProfile == null)
{
var sellerProfileRequest = await _dbContext.SellerProfileRequests.FirstOrDefaultAsync(request=>request.UserId==userId && request.Accepted==false);
if(sellerProfileRequest!=null)
return BadRequest("Account has requested to be a seller and not been approved yet.");
return Unauthorized("Account is not a seller.");
}
var url = await _storage.UploadImageAsync(file, Guid.NewGuid().ToString());
var portfolio = new SellerProfilePortfolioPiece()
{
SellerProfileId = existingSellerProfile.Id,
FileReference = url,
SellerServiceId = sellerServiceId
};
portfolio.SellerProfileId = existingSellerProfile.Id;
_dbContext.SellerProfilePortfolioPieces.Add(portfolio);
await _dbContext.SaveChangesAsync();
var result = portfolio.ToModel();
return Ok(result);
}
[HttpDelete]
[Authorize("write:seller-service")]
[Route("{sellerServiceId:int}/Portfolio/{portfolioId:int}")]
public async Task<IActionResult> DeletePortfolio(int portfolioId)
{
var userId = User.GetUserId();
var existingSellerProfile = await _dbContext.UserSellerProfiles.FirstOrDefaultAsync(sellerProfile=>sellerProfile.UserId==userId);
if (existingSellerProfile == null)
{
var sellerProfileRequest = await _dbContext.SellerProfileRequests.FirstOrDefaultAsync(request=>request.UserId==userId && request.Accepted==false);
if(sellerProfileRequest!=null)
return BadRequest("Account has requested to be a seller and not been approved yet.");
return Unauthorized("Account is not a seller.");
}
var portfolio = await _dbContext.SellerProfilePortfolioPieces.FirstOrDefaultAsync(x=>x.Id==portfolioId);
if(portfolio==null)
return NotFound("Portfolio piece not found.");
if(portfolio.SellerProfileId!=existingSellerProfile.Id)
return BadRequest("Portfolio piece does not belong to this seller.");
_dbContext.SellerProfilePortfolioPieces.Remove(portfolio);
await _dbContext.SaveChangesAsync();
return Ok();
}
}

View File

@ -0,0 +1,44 @@
using System.Security.Claims;
using ArtPlatform.API.Extensions;
using ArtPlatform.API.Models.User;
using ArtPlatform.Database;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
namespace ArtPlatform.API.Controllers;
[ApiController]
[Route("api/[controller]")]
public class UserController : Controller
{
private readonly ApplicationDbContext _dbContext;
public UserController(ApplicationDbContext dbContext)
{
_dbContext = dbContext;
}
[Authorize("read:user")]
[HttpGet]
public async Task<IActionResult> GetUser()
{
var userId = User.GetUserId();
var user = await _dbContext.Users.FirstAsync(user=>user.Id==userId);
var result = user.ToModel();
return Ok(result);
}
[Authorize("write:user")]
[HttpPut]
public async Task<IActionResult> UpdateUser(UserInfoUpdateModel model)
{
var userId = User.GetUserId();
var existingUser = await _dbContext.Users.FirstAsync(user=>user.Id==userId);
var updatedUser = model.ToEntity(existingUser);
updatedUser = _dbContext.Users.Update(updatedUser).Entity;
await _dbContext.SaveChangesAsync();
var result = updatedUser.ToModel();
return Ok(result);
}
}

View File

@ -0,0 +1,23 @@
FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base
USER $APP_UID
WORKDIR /app
EXPOSE 8080
EXPOSE 8081
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
ARG BUILD_CONFIGURATION=Release
WORKDIR /src
COPY ["ArtPlatform.API/ArtPlatform.API.csproj", "ArtPlatform.API/"]
RUN dotnet restore "ArtPlatform.API/ArtPlatform.API.csproj"
COPY . .
WORKDIR "/src/ArtPlatform.API"
RUN dotnet build "ArtPlatform.API.csproj" -c $BUILD_CONFIGURATION -o /app/build
FROM build AS publish
ARG BUILD_CONFIGURATION=Release
RUN dotnet publish "ArtPlatform.API.csproj" -c $BUILD_CONFIGURATION -o /app/publish /p:UseAppHost=false
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "ArtPlatform.API.dll"]

View File

@ -0,0 +1,11 @@
using System.Security.Claims;
namespace ArtPlatform.API.Extensions;
public static class UserExtension
{
public static string GetUserId(this ClaimsPrincipal user)
{
return user.Claims.First(claim => claim.Type == ClaimTypes.NameIdentifier).Value;
}
}

View File

@ -0,0 +1,22 @@
using Microsoft.AspNetCore.Authorization;
namespace ArtPlatform.API.Middleware.Authentication;
public class HasScopeHandler : AuthorizationHandler<HasScopeRequirement>
{
protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, HasScopeRequirement requirement)
{
// If user does not have the scope claim, get out of here
if (!context.User.HasClaim(c => c.Type == "scope" && c.Issuer == requirement.Issuer))
return Task.CompletedTask;
// Split the scopes string into an array
var scopes = context.User.FindFirst(c => c.Type == "scope" && c.Issuer == requirement.Issuer).Value.Split(' ');
// Succeed if the scope array contains the required scope
if (scopes.Any(s => s == requirement.Scope))
context.Succeed(requirement);
return Task.CompletedTask;
}
}

View File

@ -0,0 +1,15 @@
using Microsoft.AspNetCore.Authorization;
namespace ArtPlatform.API.Middleware.Authentication;
public class HasScopeRequirement : IAuthorizationRequirement
{
public string Issuer { get; }
public string Scope { get; }
public HasScopeRequirement(string scope, string issuer)
{
Scope = scope ?? throw new ArgumentNullException(nameof(scope));
Issuer = issuer ?? throw new ArgumentNullException(nameof(issuer));
}
}

View File

@ -0,0 +1,49 @@
using System.Security.Claims;
using ArtPlatform.Database;
using ArtPlatform.Database.Entities;
namespace ArtPlatform.API.Middleware;
public class UserMiddleware
{
private readonly RequestDelegate _next;
public UserMiddleware(RequestDelegate next)
{
_next = next;
}
public async Task InvokeAsync(HttpContext context, ApplicationDbContext dbContext)
{
if (context.User.Identity.IsAuthenticated)
{
var userId = context.User.Claims.First(c => c.Type == ClaimTypes.NameIdentifier).Value;
var user = await dbContext.Users.FindAsync(userId);
if (user == null)
{
user = new User
{
Id = userId,
DisplayName = context.User.Identity.Name ?? "Anonymous",
Biography = string.Empty,
Email = context.User.Claims.FirstOrDefault(x=>x.Type=="email")?.Value ?? string.Empty,
FirstName = string.Empty,
LastName = string.Empty,
AddressCountry = string.Empty,
AddressCity = string.Empty,
AddressStreet = string.Empty,
AddressHouseNumber = string.Empty,
AddressPostalCode = string.Empty,
AddressRegion = string.Empty
};
dbContext.Users.Add(user);
await dbContext.SaveChangesAsync();
}
}
await _next(context);
}
}

View File

@ -0,0 +1,8 @@
namespace ArtPlatform.API.Models.Discovery;
public class DiscoveryReviewModel
{
public string WriterDisplayName { get; set; }
public string WriterId { get; set; }
public double Rating { get; set; }
}

View File

@ -0,0 +1,8 @@
namespace ArtPlatform.API.Models.Discovery;
public class DiscoverySellerModel
{
public int Id { get; set; }
public List<string> SocialMediaLinks { get; set; }
public string Biography { get; set; }
}

View File

@ -0,0 +1,10 @@
namespace ArtPlatform.API.Models.Order;
public class MessageModel
{
public int Id { get; set; }
public string SenderId { get; set; }
public string SenderDisplayName { get; set; }
public string Message { get; set; }
public int[] Attachments { get; set; }
}

View File

@ -0,0 +1,19 @@
using ArtPlatform.Database.Entities;
namespace ArtPlatform.API.Models.Order;
public static class MessageModelExtensions
{
public static MessageModel ToModel(this SellerServiceOrderMessage sellerProfile)
{
return new MessageModel()
{
Id = sellerProfile.Id,
SenderId = sellerProfile.SenderId,
SenderDisplayName = sellerProfile.Sender.DisplayName,
Message = sellerProfile.Message,
Attachments = sellerProfile.Attachments.Select(x=>x.Id).ToArray()
};
}
}

View File

@ -0,0 +1,15 @@
using ArtPlatform.Database.Enums;
namespace ArtPlatform.API.Models.Order;
public class OrderModel
{
public int Id { get; set; }
public string BuyerId { get; set; }
public int SellerServiceId { get; set; }
public int SellerId { get; set; }
public EnumOrderStatus Status { get; set; }
public string StatusLabel => Status.ToString();
public double Price { get; set; }
}

View File

@ -0,0 +1,20 @@
using ArtPlatform.Database.Entities;
namespace ArtPlatform.API.Models.Order;
public static class OrderModelExtensions
{
public static OrderModel ToModel(this SellerServiceOrder sellerProfile)
{
return new OrderModel()
{
Id = sellerProfile.Id,
BuyerId = sellerProfile.BuyerId,
SellerServiceId = sellerProfile.SellerServiceId,
SellerId = sellerProfile.SellerId,
Status = sellerProfile.Status,
Price = sellerProfile.Price
};
}
}

View File

@ -0,0 +1,7 @@
namespace ArtPlatform.API.Models.Order;
public class SellerServiceOrderReviewModel
{
public int Rating { get; set; }
public string? Review { get; set; }
}

View File

@ -0,0 +1,7 @@
namespace ArtPlatform.API.Models.PortfolioModel;
public class PortfolioModel
{
public int Id { get; set; }
public int? SellerServiceId { get; set; }
}

View File

@ -0,0 +1,13 @@
namespace ArtPlatform.API.Models.PortfolioModel;
public static class PortfolioModelExtensions
{
public static PortfolioModel ToModel(this Database.Entities.SellerProfilePortfolioPiece sellerProfileRequest)
{
return new PortfolioModel()
{
Id = sellerProfileRequest.Id,
SellerServiceId = sellerProfileRequest.SellerServiceId
};
}
}

View File

@ -0,0 +1,7 @@
namespace ArtPlatform.API.Models.SellerProfile;
public class SellerProfileModel
{
public List<string> SocialMediaLinks { get; set; }
public string Biography { get; set; }
}

View File

@ -0,0 +1,31 @@
using ArtPlatform.API.Models.Discovery;
using ArtPlatform.Database.Entities;
namespace ArtPlatform.API.Models.SellerProfile;
public static class SellerProfileModelExtensions
{
public static SellerProfileModel ToModel(this UserSellerProfile sellerProfile)
{
return new SellerProfileModel()
{
SocialMediaLinks = sellerProfile.SocialMediaLinks,
Biography = sellerProfile.Biography
};
}
public static DiscoverySellerModel ToDiscoveryModel(this UserSellerProfile sellerProfile)
{
return new DiscoverySellerModel()
{
Id = sellerProfile.Id,
SocialMediaLinks = sellerProfile.SocialMediaLinks,
Biography = sellerProfile.Biography
};
}
public static UserSellerProfile ToModel(this SellerProfileModel sellerProfile, UserSellerProfile existingSellerProfile)
{
existingSellerProfile.SocialMediaLinks = sellerProfile.SocialMediaLinks;
existingSellerProfile.Biography = sellerProfile.Biography;
return existingSellerProfile;
}
}

View File

@ -0,0 +1,11 @@
namespace ArtPlatform.API.Models.SellerProfileRequest;
public class SellerProfileRequestModel
{
public int Id { get; set; }
public DateTime RequestDate { get; set; }
public string UserId { get; set; }
public bool Accepted { get; set; }
public virtual Database.Entities.User User { get; set; } = null!;
}

View File

@ -0,0 +1,15 @@
namespace ArtPlatform.API.Models.SellerProfileRequest;
public static class SellerProfileRequestModelExtensions
{
public static SellerProfileRequestModel ToModel(this Database.Entities.SellerProfileRequest sellerProfileRequest)
{
return new SellerProfileRequestModel()
{
Id = sellerProfileRequest.Id,
UserId = sellerProfileRequest.UserId,
RequestDate = sellerProfileRequest.RequestDate,
Accepted = sellerProfileRequest.Accepted
};
}
}

View File

@ -0,0 +1,8 @@
namespace ArtPlatform.API.Models.SellerService;
public class SellerServiceCreateModel
{
public string Name { get; set; }
public string Description { get; set; }
public double Price { get; set; }
}

View File

@ -0,0 +1,11 @@
namespace ArtPlatform.API.Models.SellerService;
public class SellerServiceModel
{
public int Id { get; set; }
public string Name { get; set; } = null!;
public string Description { get; set; } = null!;
public double Price { get; set; }
public double AverageRating { get; set; }
public int NumberOfRatings { get; set; }
}

View File

@ -0,0 +1,26 @@
namespace ArtPlatform.API.Models.SellerService;
public static class SellerServiceModelExtensions
{
public static SellerServiceModel ToModel(this Database.Entities.SellerService sellerProfileRequest)
{
double avgRating = 0;
int reviewCount = 0;
var ratings = sellerProfileRequest.Reviews;
if (ratings.Any())
{
avgRating = ratings.Average(x => x.Rating);
reviewCount = sellerProfileRequest.Reviews.Count;
}
return new SellerServiceModel()
{
Id = sellerProfileRequest.Id,
Name = sellerProfileRequest.Name,
Description = sellerProfileRequest.Description,
Price = sellerProfileRequest.Price,
AverageRating = avgRating,
NumberOfRatings = reviewCount
};
}
}

View File

@ -0,0 +1,8 @@
namespace ArtPlatform.API.Models.SellerService;
public class SellerServiceUpdateModel
{
public string Name { get; set; }
public string Description { get; set; }
public double Price { get; set; }
}

View File

@ -0,0 +1,9 @@
namespace ArtPlatform.API.Models.User;
public class UserInfoModel
{
public string Id { get; set; } = string.Empty;
public string DisplayName { get; init; } = string.Empty;
public string Biography { get; init; } = string.Empty;
public string Email { get; init; } = string.Empty;
}

View File

@ -0,0 +1,22 @@
namespace ArtPlatform.API.Models.User;
public static class UserInfoModelExtensions
{
public static UserInfoModel ToModel(this Database.Entities.User user)
{
return new()
{
Id = user.Id,
DisplayName = user.DisplayName,
Biography = user.Biography,
Email = user.Email
};
}
public static Database.Entities.User ToEntity(this UserInfoUpdateModel user, Database.Entities.User existingUser)
{
existingUser.DisplayName = user.DisplayName;
existingUser.Biography = user.Biography;
existingUser.Email = user.Email;
return existingUser;
}
}

View File

@ -0,0 +1,8 @@
namespace ArtPlatform.API.Models.User;
public class UserInfoUpdateModel
{
public string DisplayName { get; init; } = string.Empty;
public string Biography { get; init; } = string.Empty;
public string Email { get; init; } = string.Empty;
}

View File

@ -0,0 +1,156 @@
using System.Reflection;
using System.Security.Claims;
using ArtPlatform.API.Middleware;
using ArtPlatform.API.Middleware.Authentication;
using ArtPlatform.API.Services.Storage;
using ArtPlatform.Database;
using Auth0.AspNetCore.Authentication;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.AspNetCore.Authorization;
using Microsoft.IdentityModel.Tokens;
using Microsoft.OpenApi.Models;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddSingleton<IStorage,ImgCdnProvider>();
builder.Services.AddHttpContextAccessor();
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSingleton<ApplicationDbContext>();
builder.Services.AddSwaggerGen(options =>
{
options.SwaggerDoc("v1", new Microsoft.OpenApi.Models.OpenApiInfo
{
Title = "API Documentation",
Version = "v1.0",
Description = ""
});
options.ResolveConflictingActions(x => x.First());
options.AddSecurityDefinition("oauth2", new OpenApiSecurityScheme
{
Type = SecuritySchemeType.OAuth2,
BearerFormat = "JWT",
Flows = new OpenApiOAuthFlows
{
Implicit = new OpenApiOAuthFlow
{
TokenUrl = new Uri($"{builder.Configuration.GetValue<string>("Auth0:Domain")}oauth/token"),
AuthorizationUrl = new Uri($"{builder.Configuration.GetValue<string>("Auth0:Domain")}authorize?audience={builder.Configuration.GetValue<string>("Auth0:Audience")}"),
Scopes = new Dictionary<string, string>
{
{ "openid", "OpenId" },
{ "email", "Email" },
{ "profile", "Profile" },
{ "read:user", "Read your profile information." },
{ "write:user", "Update your profile information." },
{ "read:billing-information", "Read your billing information." },
{ "write:billing-information", "Update your billing information." },
{ "read:seller-profile", "Read your seller profile information."},
{ "write:seller-profile", "Update your seller profile information."},
{ "write:seller-profile-request", "Accept seller profile requests."},
{ "read:seller-profile-request", "Read seller profile requests."},
{ "read:seller-service", "Read services on your seller profile."},
{ "write:seller-service", "Update services on your seller profile."},
{ "write:orders", "Create new orders and take action against existing ones."},
{ "read:orders", "View your orders."},
{ "read:seller-orders", "View orders on your seller profile."},
{ "write:seller-orders", "Update orders on your seller profile."}
}
}
}
});
options.AddSecurityRequirement(new OpenApiSecurityRequirement
{
{
new OpenApiSecurityScheme
{
Reference = new OpenApiReference { Type = ReferenceType.SecurityScheme, Id = "oauth2" }
},
new[] { "openid", "email", "profile" }
}
});
var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";
var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile);
options.IncludeXmlComments(xmlPath);
});
builder.Services.AddControllers()
.AddJsonOptions(options=>
options.JsonSerializerOptions.ReferenceHandler = System.Text.Json.Serialization.ReferenceHandler.IgnoreCycles
);
builder.Services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
}).AddJwtBearer(options =>
{
options.Authority = $"{builder.Configuration.GetValue<string>("Auth0:Domain")}";
options.Audience = $"{builder.Configuration.GetValue<string>("Auth0:Audience")}";
});
builder.Services.AddAuthorization(options =>
{
options.AddPolicy("read:user", policy => policy.Requirements.Add(new
HasScopeRequirement("read:user", builder.Configuration.GetValue<string>("Auth0:Domain"))));
options.AddPolicy("write:user", policy => policy.Requirements.Add(new
HasScopeRequirement("write:user", builder.Configuration.GetValue<string>("Auth0:Domain"))));
options.AddPolicy("read:billing-information", policy => policy.Requirements.Add(new
HasScopeRequirement("read:billing-information", builder.Configuration.GetValue<string>("Auth0:Domain"))));
options.AddPolicy("write:billing-information", policy => policy.Requirements.Add(new
HasScopeRequirement("write:billing-information", builder.Configuration.GetValue<string>("Auth0:Domain"))));
options.AddPolicy("read:seller-profile", policy => policy.Requirements.Add(new
HasScopeRequirement("read:seller-profile", builder.Configuration.GetValue<string>("Auth0:Domain"))));
options.AddPolicy("write:seller-profile", policy => policy.Requirements.Add(new
HasScopeRequirement("write:seller-profile", builder.Configuration.GetValue<string>("Auth0:Domain"))));
options.AddPolicy("read:seller-profile-request", policy => policy.Requirements.Add(new
HasScopeRequirement("read:seller-profile-request", builder.Configuration.GetValue<string>("Auth0:Domain"))));
options.AddPolicy("write:seller-profile-request", policy => policy.Requirements.Add(new
HasScopeRequirement("write:seller-profile-request", builder.Configuration.GetValue<string>("Auth0:Domain"))));
options.AddPolicy("read:seller-service", policy => policy.Requirements.Add(new
HasScopeRequirement("read:seller-service", builder.Configuration.GetValue<string>("Auth0:Domain"))));
options.AddPolicy("write:seller-service", policy => policy.Requirements.Add(new
HasScopeRequirement("write:seller-service", builder.Configuration.GetValue<string>("Auth0:Domain"))));
options.AddPolicy("write:orders", policy => policy.Requirements.Add(new
HasScopeRequirement("write:orders", builder.Configuration.GetValue<string>("Auth0:Domain"))));
options.AddPolicy("read:orders", policy => policy.Requirements.Add(new
HasScopeRequirement("read:orders", builder.Configuration.GetValue<string>("Auth0:Domain"))));
options.AddPolicy("read:seller-orders", policy => policy.Requirements.Add(new
HasScopeRequirement("read:seller-orders", builder.Configuration.GetValue<string>("Auth0:Domain"))));
options.AddPolicy("write:seller-orders", policy => policy.Requirements.Add(new
HasScopeRequirement("write:seller-orders", builder.Configuration.GetValue<string>("Auth0:Domain"))));
});
builder.Services.AddSingleton<IAuthorizationHandler, HasScopeHandler>();
var app = builder.Build();
app.UseSwagger();
app.UseSwaggerUI(settings =>
{
if (app.Environment.IsDevelopment())
{
settings.OAuthClientId(builder.Configuration.GetValue<string>("Auth0:ClientId"));
settings.OAuthClientSecret(builder.Configuration.GetValue<string>("Auth0:ClientSecret"));
settings.OAuthUsePkce();
}
});
app.UseStaticFiles();
app.UseHttpsRedirection();
app.UseAuthentication();
app.UseMiddleware<UserMiddleware>();
app.UseAuthorization();
app.MapControllers();
app.Run();

View File

@ -1,20 +1,30 @@
{ {
"$schema": "https://json.schemastore.org/launchsettings.json", "$schema": "http://json.schemastore.org/launchsettings.json",
"iisSettings": { "iisSettings": {
"windowsAuthentication": false, "windowsAuthentication": false,
"anonymousAuthentication": true, "anonymousAuthentication": true,
"iisExpress": { "iisExpress": {
"applicationUrl": "http://localhost:59643", "applicationUrl": "http://localhost:35549",
"sslPort": 44359 "sslPort": 44383
} }
}, },
"profiles": { "profiles": {
"ArtPlatform.Api": { "http": {
"commandName": "Project", "commandName": "Project",
"dotnetRunMessages": true, "dotnetRunMessages": true,
"launchBrowser": true, "launchBrowser": true,
"launchUrl": "swagger", "launchUrl": "swagger",
"applicationUrl": "https://localhost:7159;http://localhost:5201", "applicationUrl": "http://localhost:5290",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"https": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true,
"launchUrl": "swagger",
"applicationUrl": "https://localhost:7148;http://localhost:5290",
"environmentVariables": { "environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development" "ASPNETCORE_ENVIRONMENT": "Development"
} }

View File

@ -0,0 +1,7 @@
namespace ArtPlatform.API.Services.Storage;
public interface IStorage
{
public Task<string> UploadImageAsync(IFormFile file, string fileName);
public Task<Stream> DownloadImageAsync(string fileRefrence);
}

View File

@ -0,0 +1,53 @@
using System.Net.Http;
using System.Text.Json;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
namespace ArtPlatform.API.Services.Storage
{
public class ImgCdnProvider : IStorage
{
private readonly HttpClient _client;
private const string ApiKey = "5386e05a3562c7a8f984e73401540836";
public ImgCdnProvider()
{
_client = new HttpClient { BaseAddress = new Uri("https://imgcdn.dev/") };
}
public async Task<string> UploadImageAsync(IFormFile file, string fileName)
{
using var content = new MultipartFormDataContent();
content.Add(new StringContent(ApiKey), "key");
using var fileStream = file.OpenReadStream();
content.Add(new StreamContent(fileStream), "source", fileName);
var response = await _client.PostAsync("api/1/upload", content);
if (!response.IsSuccessStatusCode)
{
throw new Exception("Failed to upload image.");
}
var responseContent = await response.Content.ReadAsStringAsync();
var jsonResponse = JsonDocument.Parse(responseContent);
var imageUrl = jsonResponse.RootElement.GetProperty("image").GetProperty("url").GetString();
return imageUrl;
}
public async Task<Stream> DownloadImageAsync(string fileReference)
{
var response = await _client.GetAsync(fileReference);
if (!response.IsSuccessStatusCode)
{
throw new Exception("Failed to download image.");
}
var stream = await response.Content.ReadAsStreamAsync();
return stream;
}
}
}

View File

@ -0,0 +1,15 @@
{
"Auth0": {
"Domain": "https://dev-12mb5yq82dow1twh.us.auth0.com/",
"Audience": "https://api.artplatform.com",
"ClientId": "19GWUL7fWFQWEpdFFtlgv2x3kqfSa0ES",
"ClientSecret": "VX5LKeGHeaqKsgNz8Kn1gQ7MSHmwrXJdC2DMjVY82_YHjiRqdPrVNpFFkXBZy8yh"
},
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*"
}

View File

@ -0,0 +1,14 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\ArtPlatform.Database\ArtPlatform.Database.csproj" />
</ItemGroup>
</Project>

View File

@ -0,0 +1,3 @@
// See https://aka.ms/new-console-template for more information
Console.WriteLine("Hello, World!");

View File

@ -0,0 +1,20 @@
using Microsoft.Extensions.Configuration;
namespace ArtPlatform.Database;
public class ApplicationDatabaseConfigurationModel
{
private readonly IConfiguration _configuration;
public ApplicationDatabaseConfigurationModel(IConfiguration configuration)
{
_configuration = configuration;
}
public string Host => _configuration?.GetValue<string>("Database:Host") ?? "localhost";
public int Port => _configuration?.GetValue<int>("Database:Port") ?? 5432;
public string Database => _configuration?.GetValue<string>("Database:Database") ?? "artplatform";
public string Username => _configuration?.GetValue<string>("Database:username") ?? "sa";
public string Password => _configuration?.GetValue<string>("Database:password") ?? "P@ssw0rd";
}

View File

@ -0,0 +1,43 @@
using ArtPlatform.Database.Entities;
using Microsoft.EntityFrameworkCore;
using Npgsql;
namespace ArtPlatform.Database;
public class ApplicationDbContext:DbContext
{
private readonly ApplicationDatabaseConfigurationModel _configuration;
// public ApplicationDbContext(ApplicationDatabaseConfigurationModel configuration, DbContextOptions<ApplicationDbContext> options):base(options)
// {
// _configuration = configuration;
// }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
var connectionStringBuilder = new NpgsqlConnectionStringBuilder()
{
Host = _configuration?.Host ?? "localhost",
Port = _configuration?.Port ?? 5432,
Database = _configuration?.Database ?? "artplatform",
Username = _configuration?.Username ?? "sa",
Password = _configuration?.Password ?? "P@ssw0rd"
};
optionsBuilder.UseNpgsql(connectionStringBuilder.ConnectionString);
base.OnConfiguring(optionsBuilder);
}
#region DB Sets
public DbSet<User> Users { get; set; } = null!;
public DbSet<UserSellerProfile> UserSellerProfiles { get; set; }= null!;
public DbSet<SellerProfileRequest> SellerProfileRequests { get; set; }= null!;
public DbSet<SellerProfilePortfolioPiece> SellerProfilePortfolioPieces { get; set; }= null!;
public DbSet<SellerService> SellerServices { get; set; }= null!;
public DbSet<SellerServiceOrder> SellerServiceOrders { get; set; }= null!;
public DbSet<SellerServiceOrderMessage> SellerServiceOrderMessages { get; set; }= null!;
public DbSet<SellerServiceOrderMessageAttachment> SellerServiceOrderMessageAttachments { get; set; }= null!;
public DbSet<SellerServiceOrderReview> SellerServiceOrderReviews { get; set; }= null!;
#endregion
}

View File

@ -0,0 +1,21 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="8.0.1" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="8.0.1">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="Microsoft.Extensions.Configuration" Version="8.0.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.Binder" Version="8.0.1" />
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="8.0.0" />
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL.Design" Version="1.1.0" />
</ItemGroup>
</Project>

View File

@ -0,0 +1,11 @@
namespace ArtPlatform.Database.Entities;
public class SellerProfilePortfolioPiece
{
public int Id { get; set; }
public int SellerProfileId { get; set; }
public string? FileReference { get; set; }
public int? SellerServiceId { get; set; }
public virtual SellerService SellerService { get; set; } = null!;
public virtual UserSellerProfile SellerProfile { get; set; } = null!;
}

View File

@ -0,0 +1,12 @@
namespace ArtPlatform.Database.Entities;
public class SellerProfileRequest
{
public int Id { get; set; }
public string UserId { get; set; } = null!;
public DateTime RequestDate { get; set; }
public DateTime? AcceptedDate { get; set; }
public bool Accepted { get; set; }
public virtual User User { get; set; } = null!;
}

View File

@ -0,0 +1,14 @@
namespace ArtPlatform.Database.Entities;
public class SellerService
{
public int Id { get; set; }
public int SellerProfileId { get; set; }
public string Name { get; set; } = null!;
public string Description { get; set; } = null!;
public double Price { get; set; }
public virtual ICollection<SellerProfilePortfolioPiece> PortfolioPieces { get; set; } = new List<SellerProfilePortfolioPiece>();
public virtual ICollection<SellerServiceOrderReview> Reviews { get; set; } = new List<SellerServiceOrderReview>();
public virtual UserSellerProfile SellerProfile { get; set; } = null!;
}

View File

@ -0,0 +1,23 @@
using ArtPlatform.Database.Enums;
namespace ArtPlatform.Database.Entities;
public class SellerServiceOrder
{
public int Id { get; set; }
public string BuyerId { get; set; }
public int SellerServiceId { get; set; }
public int SellerId { get; set; }
public EnumOrderStatus Status { get; set; }
public double Price { get; set; }
public DateTime CreatedDate { get; set; }
public DateTime? TermsAcceptedDate { get; set; }
public DateTime? EndDate { get; set; }
public virtual User Buyer { get; set; } = null!;
public virtual SellerService SellerService { get; set; } = null!;
public virtual UserSellerProfile Seller { get; set; } = null!;
public virtual ICollection<SellerServiceOrderReview> Reviews { get; set; } = new List<SellerServiceOrderReview>();
public virtual ICollection<SellerServiceOrderMessage> Messages { get; set; } = new List<SellerServiceOrderMessage>();
}

View File

@ -0,0 +1,14 @@
namespace ArtPlatform.Database.Entities;
public class SellerServiceOrderMessage
{
public int Id { get; set; }
public int SellerServiceOrderId { get; set; }
public string SenderId { get; set; }
public string Message { get; set; } = null!;
public DateTime SentAt { get; set; }
public virtual SellerServiceOrder SellerServiceOrder { get; set; } = null!;
public virtual User Sender { get; set; } = null!;
public virtual ICollection<SellerServiceOrderMessageAttachment> Attachments { get; set; } = null!;
}

View File

@ -0,0 +1,10 @@
namespace ArtPlatform.Database.Entities;
public class SellerServiceOrderMessageAttachment
{
public int Id { get; set; }
public int SellerServiceOrderMessageId { get; set; }
public string FileReference { get; set; } = null!;
public virtual SellerServiceOrderMessage SellerServiceOrderMessage { get; set; } = null!;
}

View File

@ -0,0 +1,6 @@
namespace ArtPlatform.Database.Entities;
public class SellerServiceOrderMessageModel
{
public string Message { get; set; }
}

View File

@ -0,0 +1,16 @@
namespace ArtPlatform.Database.Entities;
public class SellerServiceOrderReview
{
public int Id { get; set; }
public string ReviewerId { get; set; }
public int SellerServiceOrderId { get; set; }
public int SellerServiceId { get; set; }
public DateTime ReviewDate { get; set; }
public string? Review { get; set; }
public int Rating { get; set; }
public virtual User Reviewer { get; set; } = null!;
public virtual SellerServiceOrder SellerServiceOrder { get; set; } = null!;
public virtual SellerService SellerService { get; set; } = null!;
}

View File

@ -0,0 +1,28 @@
using System.Text.Json.Serialization;
using Microsoft.EntityFrameworkCore;
namespace ArtPlatform.Database.Entities;
[PrimaryKey(nameof(Id))]
public record User
{
public string Id { get; set; }
public string DisplayName { get; set; } = null!;
public string Biography { get; set; } = null!;
public string Email { get; set; } = null!;
public int? UserSellerProfileId { get; set; }
#region Billing Information
public string FirstName { get; set; } = null!;
public string LastName { get; set; } = null!;
public string AddressCountry { get; set; } = null!;
public string AddressCity { get; set; } = null!;
public string AddressStreet { get; set; } = null!;
public string AddressHouseNumber { get; set; } = null!;
public string AddressPostalCode { get; set; } = null!;
public string AddressRegion { get; set; } = null!;
#endregion
[JsonIgnore] public virtual UserSellerProfile? UserSellerProfile { get; set; }
[JsonIgnore] public virtual ICollection<SellerServiceOrder> Orders { get; set; }
}

View File

@ -0,0 +1,18 @@
using System.ComponentModel.DataAnnotations.Schema;
namespace ArtPlatform.Database.Entities;
public record UserSellerProfile
{
public int Id { get; set; }
[ForeignKey(nameof(User))]
public string UserId { get; set; }
public string Biography { get; set; }
public List<string> SocialMediaLinks { get; set; } = new();
public bool AgeRestricted { get; set; }
public virtual User User { get; set; } = null!;
public virtual ICollection<SellerService> SellerServices { get; set; } = new List<SellerService>();
public virtual ICollection<SellerProfilePortfolioPiece> PortfolioPieces { get; set; } = new List<SellerProfilePortfolioPiece>();
}

View File

@ -0,0 +1,12 @@
namespace ArtPlatform.Database.Enums;
public enum EnumOrderStatus
{
PendingAcceptance,
Waitlist,
DiscussingRequirements,
InProgress,
PendingReview,
Completed,
Cancelled
}

View File

@ -0,0 +1,477 @@
// <auto-generated />
using System;
using ArtPlatform.Database;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
#nullable disable
namespace ArtPlatform.Database.Migrations
{
[DbContext(typeof(ApplicationDbContext))]
[Migration("20240127055416_Initial")]
partial class Initial
{
/// <inheritdoc />
protected override void BuildTargetModel(ModelBuilder modelBuilder)
{
#pragma warning disable 612, 618
modelBuilder
.HasAnnotation("ProductVersion", "8.0.1")
.HasAnnotation("Relational:MaxIdentifierLength", 63);
NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerConfiguredSetting", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<int>("SellerSettingId")
.HasColumnType("integer");
b.Property<int>("UserSellerProfileId")
.HasColumnType("integer");
b.Property<int>("UserSellerSettingId")
.HasColumnType("integer");
b.HasKey("Id");
b.HasIndex("SellerSettingId");
b.HasIndex("UserSellerProfileId");
b.ToTable("SellerConfiguredSettings");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerProfilePortfolioPiece", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<string>("Description")
.IsRequired()
.HasColumnType("text");
b.Property<string>("FileReference")
.HasColumnType("text");
b.Property<string>("Name")
.IsRequired()
.HasColumnType("text");
b.Property<int>("SellerProfileId")
.HasColumnType("integer");
b.HasKey("Id");
b.HasIndex("SellerProfileId");
b.ToTable("SellerProfilePortfolioPieces");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerService", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<decimal?>("DepositAmount")
.HasColumnType("numeric");
b.Property<bool>("DepositRequired")
.HasColumnType("boolean");
b.Property<string>("Description")
.IsRequired()
.HasColumnType("text");
b.Property<string>("Name")
.IsRequired()
.HasColumnType("text");
b.Property<decimal>("Price")
.HasColumnType("numeric");
b.Property<int>("SellerProfileId")
.HasColumnType("integer");
b.HasKey("Id");
b.HasIndex("SellerProfileId");
b.ToTable("SellerServices");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerServiceOrder", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<string>("BuyerId")
.IsRequired()
.HasColumnType("text");
b.Property<int>("SellerServiceId")
.HasColumnType("integer");
b.Property<int>("Status")
.HasColumnType("integer");
b.HasKey("Id");
b.HasIndex("BuyerId");
b.HasIndex("SellerServiceId");
b.ToTable("SellerServiceOrders");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerServiceOrderMessage", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<string>("Message")
.IsRequired()
.HasColumnType("text");
b.Property<int>("SellerServiceOrderId")
.HasColumnType("integer");
b.Property<string>("SenderId")
.IsRequired()
.HasColumnType("text");
b.Property<DateTime>("SentAt")
.HasColumnType("timestamp with time zone");
b.HasKey("Id");
b.HasIndex("SellerServiceOrderId");
b.HasIndex("SenderId");
b.ToTable("SellerServiceOrderMessages");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerServiceOrderMessageAttachment", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<string>("FileReference")
.IsRequired()
.HasColumnType("text");
b.Property<int>("SellerServiceOrderMessageId")
.HasColumnType("integer");
b.HasKey("Id");
b.HasIndex("SellerServiceOrderMessageId");
b.ToTable("SellerServiceOrderMessageAttachments");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerServiceOrderReview", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<int>("Rating")
.HasColumnType("integer");
b.Property<string>("Review")
.HasColumnType("text");
b.Property<string>("ReviewerId")
.IsRequired()
.HasColumnType("text");
b.Property<int>("SellerServiceOrderId")
.HasColumnType("integer");
b.HasKey("Id");
b.HasIndex("ReviewerId");
b.HasIndex("SellerServiceOrderId");
b.ToTable("SellerServiceOrderReviews");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerSetting", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<string>("DefaultValue")
.HasColumnType("text");
b.Property<string>("Description")
.IsRequired()
.HasColumnType("text");
b.Property<string>("Name")
.IsRequired()
.HasColumnType("text");
b.HasKey("Id");
b.ToTable("SellerSettings");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.User", b =>
{
b.Property<string>("Id")
.HasColumnType("text");
b.Property<string>("AddressCity")
.IsRequired()
.HasColumnType("text");
b.Property<string>("AddressCountry")
.IsRequired()
.HasColumnType("text");
b.Property<string>("AddressHouseNumber")
.IsRequired()
.HasColumnType("text");
b.Property<string>("AddressPostalCode")
.IsRequired()
.HasColumnType("text");
b.Property<string>("AddressRegion")
.IsRequired()
.HasColumnType("text");
b.Property<string>("AddressStreet")
.IsRequired()
.HasColumnType("text");
b.Property<string>("Biography")
.IsRequired()
.HasColumnType("text");
b.Property<string>("DisplayName")
.IsRequired()
.HasColumnType("text");
b.Property<string>("Email")
.IsRequired()
.HasColumnType("text");
b.Property<string>("FirstName")
.IsRequired()
.HasColumnType("text");
b.Property<string>("LastName")
.IsRequired()
.HasColumnType("text");
b.Property<int?>("UserSellerProfileId")
.HasColumnType("integer");
b.HasKey("Id");
b.ToTable("Users");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.UserSellerProfile", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<bool>("AgeRestricted")
.HasColumnType("boolean");
b.Property<string>("UserId")
.IsRequired()
.HasColumnType("text");
b.HasKey("Id");
b.HasIndex("UserId")
.IsUnique();
b.ToTable("UserSellerProfiles");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerConfiguredSetting", b =>
{
b.HasOne("ArtPlatform.Database.Entities.SellerSetting", "SellerSetting")
.WithMany()
.HasForeignKey("SellerSettingId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("ArtPlatform.Database.Entities.UserSellerProfile", "UserSellerProfile")
.WithMany("ConfiguredSettings")
.HasForeignKey("UserSellerProfileId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("SellerSetting");
b.Navigation("UserSellerProfile");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerProfilePortfolioPiece", b =>
{
b.HasOne("ArtPlatform.Database.Entities.UserSellerProfile", "SellerProfile")
.WithMany("PortfolioPieces")
.HasForeignKey("SellerProfileId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("SellerProfile");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerService", b =>
{
b.HasOne("ArtPlatform.Database.Entities.UserSellerProfile", "SellerProfile")
.WithMany("SellerServices")
.HasForeignKey("SellerProfileId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("SellerProfile");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerServiceOrder", b =>
{
b.HasOne("ArtPlatform.Database.Entities.User", "Buyer")
.WithMany("Orders")
.HasForeignKey("BuyerId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("ArtPlatform.Database.Entities.SellerService", "SellerService")
.WithMany()
.HasForeignKey("SellerServiceId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("Buyer");
b.Navigation("SellerService");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerServiceOrderMessage", b =>
{
b.HasOne("ArtPlatform.Database.Entities.SellerServiceOrder", "SellerServiceOrder")
.WithMany("Messages")
.HasForeignKey("SellerServiceOrderId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("ArtPlatform.Database.Entities.User", "Sender")
.WithMany()
.HasForeignKey("SenderId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("SellerServiceOrder");
b.Navigation("Sender");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerServiceOrderMessageAttachment", b =>
{
b.HasOne("ArtPlatform.Database.Entities.SellerServiceOrderMessage", "SellerServiceOrderMessage")
.WithMany()
.HasForeignKey("SellerServiceOrderMessageId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("SellerServiceOrderMessage");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerServiceOrderReview", b =>
{
b.HasOne("ArtPlatform.Database.Entities.User", "Reviewer")
.WithMany()
.HasForeignKey("ReviewerId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("ArtPlatform.Database.Entities.SellerServiceOrder", "SellerServiceOrder")
.WithMany("Reviews")
.HasForeignKey("SellerServiceOrderId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("Reviewer");
b.Navigation("SellerServiceOrder");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.UserSellerProfile", b =>
{
b.HasOne("ArtPlatform.Database.Entities.User", "User")
.WithOne("UserSellerProfile")
.HasForeignKey("ArtPlatform.Database.Entities.UserSellerProfile", "UserId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("User");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerServiceOrder", b =>
{
b.Navigation("Messages");
b.Navigation("Reviews");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.User", b =>
{
b.Navigation("Orders");
b.Navigation("UserSellerProfile");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.UserSellerProfile", b =>
{
b.Navigation("ConfiguredSettings");
b.Navigation("PortfolioPieces");
b.Navigation("SellerServices");
});
#pragma warning restore 612, 618
}
}
}

View File

@ -0,0 +1,345 @@
using System;
using Microsoft.EntityFrameworkCore.Migrations;
using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
#nullable disable
namespace ArtPlatform.Database.Migrations
{
/// <inheritdoc />
public partial class Initial : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.CreateTable(
name: "SellerSettings",
columns: table => new
{
Id = table.Column<int>(type: "integer", nullable: false)
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
Name = table.Column<string>(type: "text", nullable: false),
Description = table.Column<string>(type: "text", nullable: false),
DefaultValue = table.Column<string>(type: "text", nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_SellerSettings", x => x.Id);
});
migrationBuilder.CreateTable(
name: "Users",
columns: table => new
{
Id = table.Column<string>(type: "text", nullable: false),
DisplayName = table.Column<string>(type: "text", nullable: false),
Biography = table.Column<string>(type: "text", nullable: false),
Email = table.Column<string>(type: "text", nullable: false),
UserSellerProfileId = table.Column<int>(type: "integer", nullable: true),
FirstName = table.Column<string>(type: "text", nullable: false),
LastName = table.Column<string>(type: "text", nullable: false),
AddressCountry = table.Column<string>(type: "text", nullable: false),
AddressCity = table.Column<string>(type: "text", nullable: false),
AddressStreet = table.Column<string>(type: "text", nullable: false),
AddressHouseNumber = table.Column<string>(type: "text", nullable: false),
AddressPostalCode = table.Column<string>(type: "text", nullable: false),
AddressRegion = table.Column<string>(type: "text", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_Users", x => x.Id);
});
migrationBuilder.CreateTable(
name: "UserSellerProfiles",
columns: table => new
{
Id = table.Column<int>(type: "integer", nullable: false)
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
UserId = table.Column<string>(type: "text", nullable: false),
AgeRestricted = table.Column<bool>(type: "boolean", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_UserSellerProfiles", x => x.Id);
table.ForeignKey(
name: "FK_UserSellerProfiles_Users_UserId",
column: x => x.UserId,
principalTable: "Users",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
});
migrationBuilder.CreateTable(
name: "SellerConfiguredSettings",
columns: table => new
{
Id = table.Column<int>(type: "integer", nullable: false)
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
UserSellerProfileId = table.Column<int>(type: "integer", nullable: false),
UserSellerSettingId = table.Column<int>(type: "integer", nullable: false),
SellerSettingId = table.Column<int>(type: "integer", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_SellerConfiguredSettings", x => x.Id);
table.ForeignKey(
name: "FK_SellerConfiguredSettings_SellerSettings_SellerSettingId",
column: x => x.SellerSettingId,
principalTable: "SellerSettings",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
table.ForeignKey(
name: "FK_SellerConfiguredSettings_UserSellerProfiles_UserSellerProfi~",
column: x => x.UserSellerProfileId,
principalTable: "UserSellerProfiles",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
});
migrationBuilder.CreateTable(
name: "SellerProfilePortfolioPieces",
columns: table => new
{
Id = table.Column<int>(type: "integer", nullable: false)
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
SellerProfileId = table.Column<int>(type: "integer", nullable: false),
Name = table.Column<string>(type: "text", nullable: false),
Description = table.Column<string>(type: "text", nullable: false),
FileReference = table.Column<string>(type: "text", nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_SellerProfilePortfolioPieces", x => x.Id);
table.ForeignKey(
name: "FK_SellerProfilePortfolioPieces_UserSellerProfiles_SellerProfi~",
column: x => x.SellerProfileId,
principalTable: "UserSellerProfiles",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
});
migrationBuilder.CreateTable(
name: "SellerServices",
columns: table => new
{
Id = table.Column<int>(type: "integer", nullable: false)
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
SellerProfileId = table.Column<int>(type: "integer", nullable: false),
Name = table.Column<string>(type: "text", nullable: false),
Description = table.Column<string>(type: "text", nullable: false),
Price = table.Column<decimal>(type: "numeric", nullable: false),
DepositRequired = table.Column<bool>(type: "boolean", nullable: false),
DepositAmount = table.Column<decimal>(type: "numeric", nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_SellerServices", x => x.Id);
table.ForeignKey(
name: "FK_SellerServices_UserSellerProfiles_SellerProfileId",
column: x => x.SellerProfileId,
principalTable: "UserSellerProfiles",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
});
migrationBuilder.CreateTable(
name: "SellerServiceOrders",
columns: table => new
{
Id = table.Column<int>(type: "integer", nullable: false)
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
BuyerId = table.Column<string>(type: "text", nullable: false),
SellerServiceId = table.Column<int>(type: "integer", nullable: false),
Status = table.Column<int>(type: "integer", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_SellerServiceOrders", x => x.Id);
table.ForeignKey(
name: "FK_SellerServiceOrders_SellerServices_SellerServiceId",
column: x => x.SellerServiceId,
principalTable: "SellerServices",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
table.ForeignKey(
name: "FK_SellerServiceOrders_Users_BuyerId",
column: x => x.BuyerId,
principalTable: "Users",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
});
migrationBuilder.CreateTable(
name: "SellerServiceOrderMessages",
columns: table => new
{
Id = table.Column<int>(type: "integer", nullable: false)
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
SellerServiceOrderId = table.Column<int>(type: "integer", nullable: false),
SenderId = table.Column<string>(type: "text", nullable: false),
Message = table.Column<string>(type: "text", nullable: false),
SentAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_SellerServiceOrderMessages", x => x.Id);
table.ForeignKey(
name: "FK_SellerServiceOrderMessages_SellerServiceOrders_SellerServic~",
column: x => x.SellerServiceOrderId,
principalTable: "SellerServiceOrders",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
table.ForeignKey(
name: "FK_SellerServiceOrderMessages_Users_SenderId",
column: x => x.SenderId,
principalTable: "Users",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
});
migrationBuilder.CreateTable(
name: "SellerServiceOrderReviews",
columns: table => new
{
Id = table.Column<int>(type: "integer", nullable: false)
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
ReviewerId = table.Column<string>(type: "text", nullable: false),
SellerServiceOrderId = table.Column<int>(type: "integer", nullable: false),
Review = table.Column<string>(type: "text", nullable: true),
Rating = table.Column<int>(type: "integer", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_SellerServiceOrderReviews", x => x.Id);
table.ForeignKey(
name: "FK_SellerServiceOrderReviews_SellerServiceOrders_SellerService~",
column: x => x.SellerServiceOrderId,
principalTable: "SellerServiceOrders",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
table.ForeignKey(
name: "FK_SellerServiceOrderReviews_Users_ReviewerId",
column: x => x.ReviewerId,
principalTable: "Users",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
});
migrationBuilder.CreateTable(
name: "SellerServiceOrderMessageAttachments",
columns: table => new
{
Id = table.Column<int>(type: "integer", nullable: false)
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
SellerServiceOrderMessageId = table.Column<int>(type: "integer", nullable: false),
FileReference = table.Column<string>(type: "text", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_SellerServiceOrderMessageAttachments", x => x.Id);
table.ForeignKey(
name: "FK_SellerServiceOrderMessageAttachments_SellerServiceOrderMess~",
column: x => x.SellerServiceOrderMessageId,
principalTable: "SellerServiceOrderMessages",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
});
migrationBuilder.CreateIndex(
name: "IX_SellerConfiguredSettings_SellerSettingId",
table: "SellerConfiguredSettings",
column: "SellerSettingId");
migrationBuilder.CreateIndex(
name: "IX_SellerConfiguredSettings_UserSellerProfileId",
table: "SellerConfiguredSettings",
column: "UserSellerProfileId");
migrationBuilder.CreateIndex(
name: "IX_SellerProfilePortfolioPieces_SellerProfileId",
table: "SellerProfilePortfolioPieces",
column: "SellerProfileId");
migrationBuilder.CreateIndex(
name: "IX_SellerServiceOrderMessageAttachments_SellerServiceOrderMess~",
table: "SellerServiceOrderMessageAttachments",
column: "SellerServiceOrderMessageId");
migrationBuilder.CreateIndex(
name: "IX_SellerServiceOrderMessages_SellerServiceOrderId",
table: "SellerServiceOrderMessages",
column: "SellerServiceOrderId");
migrationBuilder.CreateIndex(
name: "IX_SellerServiceOrderMessages_SenderId",
table: "SellerServiceOrderMessages",
column: "SenderId");
migrationBuilder.CreateIndex(
name: "IX_SellerServiceOrderReviews_ReviewerId",
table: "SellerServiceOrderReviews",
column: "ReviewerId");
migrationBuilder.CreateIndex(
name: "IX_SellerServiceOrderReviews_SellerServiceOrderId",
table: "SellerServiceOrderReviews",
column: "SellerServiceOrderId");
migrationBuilder.CreateIndex(
name: "IX_SellerServiceOrders_BuyerId",
table: "SellerServiceOrders",
column: "BuyerId");
migrationBuilder.CreateIndex(
name: "IX_SellerServiceOrders_SellerServiceId",
table: "SellerServiceOrders",
column: "SellerServiceId");
migrationBuilder.CreateIndex(
name: "IX_SellerServices_SellerProfileId",
table: "SellerServices",
column: "SellerProfileId");
migrationBuilder.CreateIndex(
name: "IX_UserSellerProfiles_UserId",
table: "UserSellerProfiles",
column: "UserId",
unique: true);
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropTable(
name: "SellerConfiguredSettings");
migrationBuilder.DropTable(
name: "SellerProfilePortfolioPieces");
migrationBuilder.DropTable(
name: "SellerServiceOrderMessageAttachments");
migrationBuilder.DropTable(
name: "SellerServiceOrderReviews");
migrationBuilder.DropTable(
name: "SellerSettings");
migrationBuilder.DropTable(
name: "SellerServiceOrderMessages");
migrationBuilder.DropTable(
name: "SellerServiceOrders");
migrationBuilder.DropTable(
name: "SellerServices");
migrationBuilder.DropTable(
name: "UserSellerProfiles");
migrationBuilder.DropTable(
name: "Users");
}
}
}

View File

@ -0,0 +1,415 @@
// <auto-generated />
using System;
using System.Collections.Generic;
using ArtPlatform.Database;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
#nullable disable
namespace ArtPlatform.Database.Migrations
{
[DbContext(typeof(ApplicationDbContext))]
[Migration("20240127065133_anotherupdate")]
partial class anotherupdate
{
/// <inheritdoc />
protected override void BuildTargetModel(ModelBuilder modelBuilder)
{
#pragma warning disable 612, 618
modelBuilder
.HasAnnotation("ProductVersion", "8.0.1")
.HasAnnotation("Relational:MaxIdentifierLength", 63);
NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerProfilePortfolioPiece", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<string>("Description")
.IsRequired()
.HasColumnType("text");
b.Property<string>("FileReference")
.HasColumnType("text");
b.Property<string>("Name")
.IsRequired()
.HasColumnType("text");
b.Property<int>("SellerProfileId")
.HasColumnType("integer");
b.HasKey("Id");
b.HasIndex("SellerProfileId");
b.ToTable("SellerProfilePortfolioPieces");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerService", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<decimal?>("DepositAmount")
.HasColumnType("numeric");
b.Property<bool>("DepositRequired")
.HasColumnType("boolean");
b.Property<string>("Description")
.IsRequired()
.HasColumnType("text");
b.Property<string>("Name")
.IsRequired()
.HasColumnType("text");
b.Property<decimal>("Price")
.HasColumnType("numeric");
b.Property<int>("SellerProfileId")
.HasColumnType("integer");
b.HasKey("Id");
b.HasIndex("SellerProfileId");
b.ToTable("SellerServices");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerServiceOrder", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<string>("BuyerId")
.IsRequired()
.HasColumnType("text");
b.Property<int>("SellerServiceId")
.HasColumnType("integer");
b.Property<int>("Status")
.HasColumnType("integer");
b.HasKey("Id");
b.HasIndex("BuyerId");
b.HasIndex("SellerServiceId");
b.ToTable("SellerServiceOrders");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerServiceOrderMessage", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<string>("Message")
.IsRequired()
.HasColumnType("text");
b.Property<int>("SellerServiceOrderId")
.HasColumnType("integer");
b.Property<string>("SenderId")
.IsRequired()
.HasColumnType("text");
b.Property<DateTime>("SentAt")
.HasColumnType("timestamp with time zone");
b.HasKey("Id");
b.HasIndex("SellerServiceOrderId");
b.HasIndex("SenderId");
b.ToTable("SellerServiceOrderMessages");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerServiceOrderMessageAttachment", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<string>("FileReference")
.IsRequired()
.HasColumnType("text");
b.Property<int>("SellerServiceOrderMessageId")
.HasColumnType("integer");
b.HasKey("Id");
b.HasIndex("SellerServiceOrderMessageId");
b.ToTable("SellerServiceOrderMessageAttachments");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerServiceOrderReview", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<int>("Rating")
.HasColumnType("integer");
b.Property<string>("Review")
.HasColumnType("text");
b.Property<string>("ReviewerId")
.IsRequired()
.HasColumnType("text");
b.Property<int>("SellerServiceOrderId")
.HasColumnType("integer");
b.HasKey("Id");
b.HasIndex("ReviewerId");
b.HasIndex("SellerServiceOrderId");
b.ToTable("SellerServiceOrderReviews");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.User", b =>
{
b.Property<string>("Id")
.HasColumnType("text");
b.Property<string>("AddressCity")
.IsRequired()
.HasColumnType("text");
b.Property<string>("AddressCountry")
.IsRequired()
.HasColumnType("text");
b.Property<string>("AddressHouseNumber")
.IsRequired()
.HasColumnType("text");
b.Property<string>("AddressPostalCode")
.IsRequired()
.HasColumnType("text");
b.Property<string>("AddressRegion")
.IsRequired()
.HasColumnType("text");
b.Property<string>("AddressStreet")
.IsRequired()
.HasColumnType("text");
b.Property<string>("Biography")
.IsRequired()
.HasColumnType("text");
b.Property<string>("DisplayName")
.IsRequired()
.HasColumnType("text");
b.Property<string>("Email")
.IsRequired()
.HasColumnType("text");
b.Property<string>("FirstName")
.IsRequired()
.HasColumnType("text");
b.Property<string>("LastName")
.IsRequired()
.HasColumnType("text");
b.Property<int?>("UserSellerProfileId")
.HasColumnType("integer");
b.HasKey("Id");
b.ToTable("Users");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.UserSellerProfile", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<bool>("AgeRestricted")
.HasColumnType("boolean");
b.Property<string>("Biography")
.IsRequired()
.HasColumnType("text");
b.Property<List<string>>("SocialMediaLinks")
.IsRequired()
.HasColumnType("text[]");
b.Property<string>("UserId")
.IsRequired()
.HasColumnType("text");
b.HasKey("Id");
b.HasIndex("UserId")
.IsUnique();
b.ToTable("UserSellerProfiles");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerProfilePortfolioPiece", b =>
{
b.HasOne("ArtPlatform.Database.Entities.UserSellerProfile", "SellerProfile")
.WithMany("PortfolioPieces")
.HasForeignKey("SellerProfileId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("SellerProfile");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerService", b =>
{
b.HasOne("ArtPlatform.Database.Entities.UserSellerProfile", "SellerProfile")
.WithMany("SellerServices")
.HasForeignKey("SellerProfileId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("SellerProfile");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerServiceOrder", b =>
{
b.HasOne("ArtPlatform.Database.Entities.User", "Buyer")
.WithMany("Orders")
.HasForeignKey("BuyerId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("ArtPlatform.Database.Entities.SellerService", "SellerService")
.WithMany()
.HasForeignKey("SellerServiceId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("Buyer");
b.Navigation("SellerService");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerServiceOrderMessage", b =>
{
b.HasOne("ArtPlatform.Database.Entities.SellerServiceOrder", "SellerServiceOrder")
.WithMany("Messages")
.HasForeignKey("SellerServiceOrderId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("ArtPlatform.Database.Entities.User", "Sender")
.WithMany()
.HasForeignKey("SenderId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("SellerServiceOrder");
b.Navigation("Sender");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerServiceOrderMessageAttachment", b =>
{
b.HasOne("ArtPlatform.Database.Entities.SellerServiceOrderMessage", "SellerServiceOrderMessage")
.WithMany()
.HasForeignKey("SellerServiceOrderMessageId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("SellerServiceOrderMessage");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerServiceOrderReview", b =>
{
b.HasOne("ArtPlatform.Database.Entities.User", "Reviewer")
.WithMany()
.HasForeignKey("ReviewerId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("ArtPlatform.Database.Entities.SellerServiceOrder", "SellerServiceOrder")
.WithMany("Reviews")
.HasForeignKey("SellerServiceOrderId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("Reviewer");
b.Navigation("SellerServiceOrder");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.UserSellerProfile", b =>
{
b.HasOne("ArtPlatform.Database.Entities.User", "User")
.WithOne("UserSellerProfile")
.HasForeignKey("ArtPlatform.Database.Entities.UserSellerProfile", "UserId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("User");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerServiceOrder", b =>
{
b.Navigation("Messages");
b.Navigation("Reviews");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.User", b =>
{
b.Navigation("Orders");
b.Navigation("UserSellerProfile");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.UserSellerProfile", b =>
{
b.Navigation("PortfolioPieces");
b.Navigation("SellerServices");
});
#pragma warning restore 612, 618
}
}
}

View File

@ -0,0 +1,99 @@
using System.Collections.Generic;
using Microsoft.EntityFrameworkCore.Migrations;
using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
#nullable disable
namespace ArtPlatform.Database.Migrations
{
/// <inheritdoc />
public partial class anotherupdate : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropTable(
name: "SellerConfiguredSettings");
migrationBuilder.DropTable(
name: "SellerSettings");
migrationBuilder.AddColumn<string>(
name: "Biography",
table: "UserSellerProfiles",
type: "text",
nullable: false,
defaultValue: "");
migrationBuilder.AddColumn<List<string>>(
name: "SocialMediaLinks",
table: "UserSellerProfiles",
type: "text[]",
nullable: false);
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropColumn(
name: "Biography",
table: "UserSellerProfiles");
migrationBuilder.DropColumn(
name: "SocialMediaLinks",
table: "UserSellerProfiles");
migrationBuilder.CreateTable(
name: "SellerSettings",
columns: table => new
{
Id = table.Column<int>(type: "integer", nullable: false)
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
DefaultValue = table.Column<string>(type: "text", nullable: true),
Description = table.Column<string>(type: "text", nullable: false),
Name = table.Column<string>(type: "text", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_SellerSettings", x => x.Id);
});
migrationBuilder.CreateTable(
name: "SellerConfiguredSettings",
columns: table => new
{
Id = table.Column<int>(type: "integer", nullable: false)
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
SellerSettingId = table.Column<int>(type: "integer", nullable: false),
UserSellerProfileId = table.Column<int>(type: "integer", nullable: false),
UserSellerSettingId = table.Column<int>(type: "integer", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_SellerConfiguredSettings", x => x.Id);
table.ForeignKey(
name: "FK_SellerConfiguredSettings_SellerSettings_SellerSettingId",
column: x => x.SellerSettingId,
principalTable: "SellerSettings",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
table.ForeignKey(
name: "FK_SellerConfiguredSettings_UserSellerProfiles_UserSellerProfi~",
column: x => x.UserSellerProfileId,
principalTable: "UserSellerProfiles",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
});
migrationBuilder.CreateIndex(
name: "IX_SellerConfiguredSettings_SellerSettingId",
table: "SellerConfiguredSettings",
column: "SellerSettingId");
migrationBuilder.CreateIndex(
name: "IX_SellerConfiguredSettings_UserSellerProfileId",
table: "SellerConfiguredSettings",
column: "UserSellerProfileId");
}
}
}

View File

@ -0,0 +1,451 @@
// <auto-generated />
using System;
using System.Collections.Generic;
using ArtPlatform.Database;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
#nullable disable
namespace ArtPlatform.Database.Migrations
{
[DbContext(typeof(ApplicationDbContext))]
[Migration("20240127071156_updateagainn")]
partial class updateagainn
{
/// <inheritdoc />
protected override void BuildTargetModel(ModelBuilder modelBuilder)
{
#pragma warning disable 612, 618
modelBuilder
.HasAnnotation("ProductVersion", "8.0.1")
.HasAnnotation("Relational:MaxIdentifierLength", 63);
NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerProfilePortfolioPiece", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<string>("Description")
.IsRequired()
.HasColumnType("text");
b.Property<string>("FileReference")
.HasColumnType("text");
b.Property<string>("Name")
.IsRequired()
.HasColumnType("text");
b.Property<int>("SellerProfileId")
.HasColumnType("integer");
b.HasKey("Id");
b.HasIndex("SellerProfileId");
b.ToTable("SellerProfilePortfolioPieces");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerProfileRequest", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<bool>("Accepted")
.HasColumnType("boolean");
b.Property<DateTime>("RequestDate")
.HasColumnType("timestamp with time zone");
b.Property<string>("UserId")
.IsRequired()
.HasColumnType("text");
b.HasKey("Id");
b.HasIndex("UserId");
b.ToTable("SellerProfileRequests");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerService", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<decimal?>("DepositAmount")
.HasColumnType("numeric");
b.Property<bool>("DepositRequired")
.HasColumnType("boolean");
b.Property<string>("Description")
.IsRequired()
.HasColumnType("text");
b.Property<string>("Name")
.IsRequired()
.HasColumnType("text");
b.Property<decimal>("Price")
.HasColumnType("numeric");
b.Property<int>("SellerProfileId")
.HasColumnType("integer");
b.HasKey("Id");
b.HasIndex("SellerProfileId");
b.ToTable("SellerServices");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerServiceOrder", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<string>("BuyerId")
.IsRequired()
.HasColumnType("text");
b.Property<int>("SellerServiceId")
.HasColumnType("integer");
b.Property<int>("Status")
.HasColumnType("integer");
b.HasKey("Id");
b.HasIndex("BuyerId");
b.HasIndex("SellerServiceId");
b.ToTable("SellerServiceOrders");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerServiceOrderMessage", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<string>("Message")
.IsRequired()
.HasColumnType("text");
b.Property<int>("SellerServiceOrderId")
.HasColumnType("integer");
b.Property<string>("SenderId")
.IsRequired()
.HasColumnType("text");
b.Property<DateTime>("SentAt")
.HasColumnType("timestamp with time zone");
b.HasKey("Id");
b.HasIndex("SellerServiceOrderId");
b.HasIndex("SenderId");
b.ToTable("SellerServiceOrderMessages");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerServiceOrderMessageAttachment", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<string>("FileReference")
.IsRequired()
.HasColumnType("text");
b.Property<int>("SellerServiceOrderMessageId")
.HasColumnType("integer");
b.HasKey("Id");
b.HasIndex("SellerServiceOrderMessageId");
b.ToTable("SellerServiceOrderMessageAttachments");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerServiceOrderReview", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<int>("Rating")
.HasColumnType("integer");
b.Property<string>("Review")
.HasColumnType("text");
b.Property<string>("ReviewerId")
.IsRequired()
.HasColumnType("text");
b.Property<int>("SellerServiceOrderId")
.HasColumnType("integer");
b.HasKey("Id");
b.HasIndex("ReviewerId");
b.HasIndex("SellerServiceOrderId");
b.ToTable("SellerServiceOrderReviews");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.User", b =>
{
b.Property<string>("Id")
.HasColumnType("text");
b.Property<string>("AddressCity")
.IsRequired()
.HasColumnType("text");
b.Property<string>("AddressCountry")
.IsRequired()
.HasColumnType("text");
b.Property<string>("AddressHouseNumber")
.IsRequired()
.HasColumnType("text");
b.Property<string>("AddressPostalCode")
.IsRequired()
.HasColumnType("text");
b.Property<string>("AddressRegion")
.IsRequired()
.HasColumnType("text");
b.Property<string>("AddressStreet")
.IsRequired()
.HasColumnType("text");
b.Property<string>("Biography")
.IsRequired()
.HasColumnType("text");
b.Property<string>("DisplayName")
.IsRequired()
.HasColumnType("text");
b.Property<string>("Email")
.IsRequired()
.HasColumnType("text");
b.Property<string>("FirstName")
.IsRequired()
.HasColumnType("text");
b.Property<string>("LastName")
.IsRequired()
.HasColumnType("text");
b.Property<int?>("UserSellerProfileId")
.HasColumnType("integer");
b.HasKey("Id");
b.ToTable("Users");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.UserSellerProfile", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<bool>("AgeRestricted")
.HasColumnType("boolean");
b.Property<string>("Biography")
.IsRequired()
.HasColumnType("text");
b.Property<List<string>>("SocialMediaLinks")
.IsRequired()
.HasColumnType("text[]");
b.Property<string>("UserId")
.IsRequired()
.HasColumnType("text");
b.HasKey("Id");
b.HasIndex("UserId")
.IsUnique();
b.ToTable("UserSellerProfiles");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerProfilePortfolioPiece", b =>
{
b.HasOne("ArtPlatform.Database.Entities.UserSellerProfile", "SellerProfile")
.WithMany("PortfolioPieces")
.HasForeignKey("SellerProfileId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("SellerProfile");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerProfileRequest", b =>
{
b.HasOne("ArtPlatform.Database.Entities.User", "User")
.WithMany()
.HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("User");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerService", b =>
{
b.HasOne("ArtPlatform.Database.Entities.UserSellerProfile", "SellerProfile")
.WithMany("SellerServices")
.HasForeignKey("SellerProfileId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("SellerProfile");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerServiceOrder", b =>
{
b.HasOne("ArtPlatform.Database.Entities.User", "Buyer")
.WithMany("Orders")
.HasForeignKey("BuyerId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("ArtPlatform.Database.Entities.SellerService", "SellerService")
.WithMany()
.HasForeignKey("SellerServiceId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("Buyer");
b.Navigation("SellerService");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerServiceOrderMessage", b =>
{
b.HasOne("ArtPlatform.Database.Entities.SellerServiceOrder", "SellerServiceOrder")
.WithMany("Messages")
.HasForeignKey("SellerServiceOrderId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("ArtPlatform.Database.Entities.User", "Sender")
.WithMany()
.HasForeignKey("SenderId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("SellerServiceOrder");
b.Navigation("Sender");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerServiceOrderMessageAttachment", b =>
{
b.HasOne("ArtPlatform.Database.Entities.SellerServiceOrderMessage", "SellerServiceOrderMessage")
.WithMany()
.HasForeignKey("SellerServiceOrderMessageId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("SellerServiceOrderMessage");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerServiceOrderReview", b =>
{
b.HasOne("ArtPlatform.Database.Entities.User", "Reviewer")
.WithMany()
.HasForeignKey("ReviewerId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("ArtPlatform.Database.Entities.SellerServiceOrder", "SellerServiceOrder")
.WithMany("Reviews")
.HasForeignKey("SellerServiceOrderId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("Reviewer");
b.Navigation("SellerServiceOrder");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.UserSellerProfile", b =>
{
b.HasOne("ArtPlatform.Database.Entities.User", "User")
.WithOne("UserSellerProfile")
.HasForeignKey("ArtPlatform.Database.Entities.UserSellerProfile", "UserId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("User");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerServiceOrder", b =>
{
b.Navigation("Messages");
b.Navigation("Reviews");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.User", b =>
{
b.Navigation("Orders");
b.Navigation("UserSellerProfile");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.UserSellerProfile", b =>
{
b.Navigation("PortfolioPieces");
b.Navigation("SellerServices");
});
#pragma warning restore 612, 618
}
}
}

View File

@ -0,0 +1,49 @@
using System;
using Microsoft.EntityFrameworkCore.Migrations;
using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
#nullable disable
namespace ArtPlatform.Database.Migrations
{
/// <inheritdoc />
public partial class updateagainn : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.CreateTable(
name: "SellerProfileRequests",
columns: table => new
{
Id = table.Column<int>(type: "integer", nullable: false)
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
UserId = table.Column<string>(type: "text", nullable: false),
RequestDate = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
Accepted = table.Column<bool>(type: "boolean", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_SellerProfileRequests", x => x.Id);
table.ForeignKey(
name: "FK_SellerProfileRequests_Users_UserId",
column: x => x.UserId,
principalTable: "Users",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
});
migrationBuilder.CreateIndex(
name: "IX_SellerProfileRequests_UserId",
table: "SellerProfileRequests",
column: "UserId");
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropTable(
name: "SellerProfileRequests");
}
}
}

View File

@ -0,0 +1,454 @@
// <auto-generated />
using System;
using System.Collections.Generic;
using ArtPlatform.Database;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
#nullable disable
namespace ArtPlatform.Database.Migrations
{
[DbContext(typeof(ApplicationDbContext))]
[Migration("20240127072659_updatesss")]
partial class updatesss
{
/// <inheritdoc />
protected override void BuildTargetModel(ModelBuilder modelBuilder)
{
#pragma warning disable 612, 618
modelBuilder
.HasAnnotation("ProductVersion", "8.0.1")
.HasAnnotation("Relational:MaxIdentifierLength", 63);
NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerProfilePortfolioPiece", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<string>("Description")
.IsRequired()
.HasColumnType("text");
b.Property<string>("FileReference")
.HasColumnType("text");
b.Property<string>("Name")
.IsRequired()
.HasColumnType("text");
b.Property<int>("SellerProfileId")
.HasColumnType("integer");
b.HasKey("Id");
b.HasIndex("SellerProfileId");
b.ToTable("SellerProfilePortfolioPieces");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerProfileRequest", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<bool>("Accepted")
.HasColumnType("boolean");
b.Property<DateTime?>("AcceptedDate")
.HasColumnType("timestamp with time zone");
b.Property<DateTime>("RequestDate")
.HasColumnType("timestamp with time zone");
b.Property<string>("UserId")
.IsRequired()
.HasColumnType("text");
b.HasKey("Id");
b.HasIndex("UserId");
b.ToTable("SellerProfileRequests");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerService", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<decimal?>("DepositAmount")
.HasColumnType("numeric");
b.Property<bool>("DepositRequired")
.HasColumnType("boolean");
b.Property<string>("Description")
.IsRequired()
.HasColumnType("text");
b.Property<string>("Name")
.IsRequired()
.HasColumnType("text");
b.Property<decimal>("Price")
.HasColumnType("numeric");
b.Property<int>("SellerProfileId")
.HasColumnType("integer");
b.HasKey("Id");
b.HasIndex("SellerProfileId");
b.ToTable("SellerServices");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerServiceOrder", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<string>("BuyerId")
.IsRequired()
.HasColumnType("text");
b.Property<int>("SellerServiceId")
.HasColumnType("integer");
b.Property<int>("Status")
.HasColumnType("integer");
b.HasKey("Id");
b.HasIndex("BuyerId");
b.HasIndex("SellerServiceId");
b.ToTable("SellerServiceOrders");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerServiceOrderMessage", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<string>("Message")
.IsRequired()
.HasColumnType("text");
b.Property<int>("SellerServiceOrderId")
.HasColumnType("integer");
b.Property<string>("SenderId")
.IsRequired()
.HasColumnType("text");
b.Property<DateTime>("SentAt")
.HasColumnType("timestamp with time zone");
b.HasKey("Id");
b.HasIndex("SellerServiceOrderId");
b.HasIndex("SenderId");
b.ToTable("SellerServiceOrderMessages");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerServiceOrderMessageAttachment", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<string>("FileReference")
.IsRequired()
.HasColumnType("text");
b.Property<int>("SellerServiceOrderMessageId")
.HasColumnType("integer");
b.HasKey("Id");
b.HasIndex("SellerServiceOrderMessageId");
b.ToTable("SellerServiceOrderMessageAttachments");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerServiceOrderReview", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<int>("Rating")
.HasColumnType("integer");
b.Property<string>("Review")
.HasColumnType("text");
b.Property<string>("ReviewerId")
.IsRequired()
.HasColumnType("text");
b.Property<int>("SellerServiceOrderId")
.HasColumnType("integer");
b.HasKey("Id");
b.HasIndex("ReviewerId");
b.HasIndex("SellerServiceOrderId");
b.ToTable("SellerServiceOrderReviews");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.User", b =>
{
b.Property<string>("Id")
.HasColumnType("text");
b.Property<string>("AddressCity")
.IsRequired()
.HasColumnType("text");
b.Property<string>("AddressCountry")
.IsRequired()
.HasColumnType("text");
b.Property<string>("AddressHouseNumber")
.IsRequired()
.HasColumnType("text");
b.Property<string>("AddressPostalCode")
.IsRequired()
.HasColumnType("text");
b.Property<string>("AddressRegion")
.IsRequired()
.HasColumnType("text");
b.Property<string>("AddressStreet")
.IsRequired()
.HasColumnType("text");
b.Property<string>("Biography")
.IsRequired()
.HasColumnType("text");
b.Property<string>("DisplayName")
.IsRequired()
.HasColumnType("text");
b.Property<string>("Email")
.IsRequired()
.HasColumnType("text");
b.Property<string>("FirstName")
.IsRequired()
.HasColumnType("text");
b.Property<string>("LastName")
.IsRequired()
.HasColumnType("text");
b.Property<int?>("UserSellerProfileId")
.HasColumnType("integer");
b.HasKey("Id");
b.ToTable("Users");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.UserSellerProfile", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<bool>("AgeRestricted")
.HasColumnType("boolean");
b.Property<string>("Biography")
.IsRequired()
.HasColumnType("text");
b.Property<List<string>>("SocialMediaLinks")
.IsRequired()
.HasColumnType("text[]");
b.Property<string>("UserId")
.IsRequired()
.HasColumnType("text");
b.HasKey("Id");
b.HasIndex("UserId")
.IsUnique();
b.ToTable("UserSellerProfiles");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerProfilePortfolioPiece", b =>
{
b.HasOne("ArtPlatform.Database.Entities.UserSellerProfile", "SellerProfile")
.WithMany("PortfolioPieces")
.HasForeignKey("SellerProfileId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("SellerProfile");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerProfileRequest", b =>
{
b.HasOne("ArtPlatform.Database.Entities.User", "User")
.WithMany()
.HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("User");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerService", b =>
{
b.HasOne("ArtPlatform.Database.Entities.UserSellerProfile", "SellerProfile")
.WithMany("SellerServices")
.HasForeignKey("SellerProfileId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("SellerProfile");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerServiceOrder", b =>
{
b.HasOne("ArtPlatform.Database.Entities.User", "Buyer")
.WithMany("Orders")
.HasForeignKey("BuyerId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("ArtPlatform.Database.Entities.SellerService", "SellerService")
.WithMany()
.HasForeignKey("SellerServiceId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("Buyer");
b.Navigation("SellerService");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerServiceOrderMessage", b =>
{
b.HasOne("ArtPlatform.Database.Entities.SellerServiceOrder", "SellerServiceOrder")
.WithMany("Messages")
.HasForeignKey("SellerServiceOrderId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("ArtPlatform.Database.Entities.User", "Sender")
.WithMany()
.HasForeignKey("SenderId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("SellerServiceOrder");
b.Navigation("Sender");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerServiceOrderMessageAttachment", b =>
{
b.HasOne("ArtPlatform.Database.Entities.SellerServiceOrderMessage", "SellerServiceOrderMessage")
.WithMany()
.HasForeignKey("SellerServiceOrderMessageId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("SellerServiceOrderMessage");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerServiceOrderReview", b =>
{
b.HasOne("ArtPlatform.Database.Entities.User", "Reviewer")
.WithMany()
.HasForeignKey("ReviewerId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("ArtPlatform.Database.Entities.SellerServiceOrder", "SellerServiceOrder")
.WithMany("Reviews")
.HasForeignKey("SellerServiceOrderId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("Reviewer");
b.Navigation("SellerServiceOrder");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.UserSellerProfile", b =>
{
b.HasOne("ArtPlatform.Database.Entities.User", "User")
.WithOne("UserSellerProfile")
.HasForeignKey("ArtPlatform.Database.Entities.UserSellerProfile", "UserId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("User");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerServiceOrder", b =>
{
b.Navigation("Messages");
b.Navigation("Reviews");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.User", b =>
{
b.Navigation("Orders");
b.Navigation("UserSellerProfile");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.UserSellerProfile", b =>
{
b.Navigation("PortfolioPieces");
b.Navigation("SellerServices");
});
#pragma warning restore 612, 618
}
}
}

View File

@ -0,0 +1,29 @@
using System;
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace ArtPlatform.Database.Migrations
{
/// <inheritdoc />
public partial class updatesss : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.AddColumn<DateTime>(
name: "AcceptedDate",
table: "SellerProfileRequests",
type: "timestamp with time zone",
nullable: true);
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropColumn(
name: "AcceptedDate",
table: "SellerProfileRequests");
}
}
}

View File

@ -0,0 +1,467 @@
// <auto-generated />
using System;
using System.Collections.Generic;
using ArtPlatform.Database;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
#nullable disable
namespace ArtPlatform.Database.Migrations
{
[DbContext(typeof(ApplicationDbContext))]
[Migration("20240127075103_updatess")]
partial class updatess
{
/// <inheritdoc />
protected override void BuildTargetModel(ModelBuilder modelBuilder)
{
#pragma warning disable 612, 618
modelBuilder
.HasAnnotation("ProductVersion", "8.0.1")
.HasAnnotation("Relational:MaxIdentifierLength", 63);
NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerProfilePortfolioPiece", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<string>("Description")
.IsRequired()
.HasColumnType("text");
b.Property<string>("FileReference")
.HasColumnType("text");
b.Property<string>("Name")
.IsRequired()
.HasColumnType("text");
b.Property<int>("SellerProfileId")
.HasColumnType("integer");
b.HasKey("Id");
b.HasIndex("SellerProfileId");
b.ToTable("SellerProfilePortfolioPieces");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerProfileRequest", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<bool>("Accepted")
.HasColumnType("boolean");
b.Property<DateTime?>("AcceptedDate")
.HasColumnType("timestamp with time zone");
b.Property<DateTime>("RequestDate")
.HasColumnType("timestamp with time zone");
b.Property<string>("UserId")
.IsRequired()
.HasColumnType("text");
b.HasKey("Id");
b.HasIndex("UserId");
b.ToTable("SellerProfileRequests");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerService", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<decimal?>("DepositAmount")
.HasColumnType("numeric");
b.Property<bool>("DepositRequired")
.HasColumnType("boolean");
b.Property<string>("Description")
.IsRequired()
.HasColumnType("text");
b.Property<string>("Name")
.IsRequired()
.HasColumnType("text");
b.Property<decimal>("Price")
.HasColumnType("numeric");
b.Property<int>("SellerProfileId")
.HasColumnType("integer");
b.HasKey("Id");
b.HasIndex("SellerProfileId");
b.ToTable("SellerServices");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerServiceOrder", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<string>("BuyerId")
.IsRequired()
.HasColumnType("text");
b.Property<int>("SellerServiceId")
.HasColumnType("integer");
b.Property<int>("Status")
.HasColumnType("integer");
b.HasKey("Id");
b.HasIndex("BuyerId");
b.HasIndex("SellerServiceId");
b.ToTable("SellerServiceOrders");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerServiceOrderMessage", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<string>("Message")
.IsRequired()
.HasColumnType("text");
b.Property<int>("SellerServiceOrderId")
.HasColumnType("integer");
b.Property<string>("SenderId")
.IsRequired()
.HasColumnType("text");
b.Property<DateTime>("SentAt")
.HasColumnType("timestamp with time zone");
b.HasKey("Id");
b.HasIndex("SellerServiceOrderId");
b.HasIndex("SenderId");
b.ToTable("SellerServiceOrderMessages");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerServiceOrderMessageAttachment", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<string>("FileReference")
.IsRequired()
.HasColumnType("text");
b.Property<int>("SellerServiceOrderMessageId")
.HasColumnType("integer");
b.HasKey("Id");
b.HasIndex("SellerServiceOrderMessageId");
b.ToTable("SellerServiceOrderMessageAttachments");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerServiceOrderReview", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<int>("Rating")
.HasColumnType("integer");
b.Property<string>("Review")
.HasColumnType("text");
b.Property<string>("ReviewerId")
.IsRequired()
.HasColumnType("text");
b.Property<int>("SellerServiceId")
.HasColumnType("integer");
b.Property<int>("SellerServiceOrderId")
.HasColumnType("integer");
b.HasKey("Id");
b.HasIndex("ReviewerId");
b.HasIndex("SellerServiceId");
b.HasIndex("SellerServiceOrderId");
b.ToTable("SellerServiceOrderReviews");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.User", b =>
{
b.Property<string>("Id")
.HasColumnType("text");
b.Property<string>("AddressCity")
.IsRequired()
.HasColumnType("text");
b.Property<string>("AddressCountry")
.IsRequired()
.HasColumnType("text");
b.Property<string>("AddressHouseNumber")
.IsRequired()
.HasColumnType("text");
b.Property<string>("AddressPostalCode")
.IsRequired()
.HasColumnType("text");
b.Property<string>("AddressRegion")
.IsRequired()
.HasColumnType("text");
b.Property<string>("AddressStreet")
.IsRequired()
.HasColumnType("text");
b.Property<string>("Biography")
.IsRequired()
.HasColumnType("text");
b.Property<string>("DisplayName")
.IsRequired()
.HasColumnType("text");
b.Property<string>("Email")
.IsRequired()
.HasColumnType("text");
b.Property<string>("FirstName")
.IsRequired()
.HasColumnType("text");
b.Property<string>("LastName")
.IsRequired()
.HasColumnType("text");
b.Property<int?>("UserSellerProfileId")
.HasColumnType("integer");
b.HasKey("Id");
b.ToTable("Users");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.UserSellerProfile", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<bool>("AgeRestricted")
.HasColumnType("boolean");
b.Property<string>("Biography")
.IsRequired()
.HasColumnType("text");
b.Property<List<string>>("SocialMediaLinks")
.IsRequired()
.HasColumnType("text[]");
b.Property<string>("UserId")
.IsRequired()
.HasColumnType("text");
b.HasKey("Id");
b.HasIndex("UserId")
.IsUnique();
b.ToTable("UserSellerProfiles");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerProfilePortfolioPiece", b =>
{
b.HasOne("ArtPlatform.Database.Entities.UserSellerProfile", "SellerProfile")
.WithMany("PortfolioPieces")
.HasForeignKey("SellerProfileId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("SellerProfile");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerProfileRequest", b =>
{
b.HasOne("ArtPlatform.Database.Entities.User", "User")
.WithMany()
.HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("User");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerService", b =>
{
b.HasOne("ArtPlatform.Database.Entities.UserSellerProfile", "SellerProfile")
.WithMany("SellerServices")
.HasForeignKey("SellerProfileId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("SellerProfile");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerServiceOrder", b =>
{
b.HasOne("ArtPlatform.Database.Entities.User", "Buyer")
.WithMany("Orders")
.HasForeignKey("BuyerId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("ArtPlatform.Database.Entities.SellerService", "SellerService")
.WithMany()
.HasForeignKey("SellerServiceId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("Buyer");
b.Navigation("SellerService");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerServiceOrderMessage", b =>
{
b.HasOne("ArtPlatform.Database.Entities.SellerServiceOrder", "SellerServiceOrder")
.WithMany("Messages")
.HasForeignKey("SellerServiceOrderId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("ArtPlatform.Database.Entities.User", "Sender")
.WithMany()
.HasForeignKey("SenderId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("SellerServiceOrder");
b.Navigation("Sender");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerServiceOrderMessageAttachment", b =>
{
b.HasOne("ArtPlatform.Database.Entities.SellerServiceOrderMessage", "SellerServiceOrderMessage")
.WithMany()
.HasForeignKey("SellerServiceOrderMessageId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("SellerServiceOrderMessage");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerServiceOrderReview", b =>
{
b.HasOne("ArtPlatform.Database.Entities.User", "Reviewer")
.WithMany()
.HasForeignKey("ReviewerId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("ArtPlatform.Database.Entities.SellerService", "SellerService")
.WithMany()
.HasForeignKey("SellerServiceId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("ArtPlatform.Database.Entities.SellerServiceOrder", "SellerServiceOrder")
.WithMany("Reviews")
.HasForeignKey("SellerServiceOrderId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("Reviewer");
b.Navigation("SellerService");
b.Navigation("SellerServiceOrder");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.UserSellerProfile", b =>
{
b.HasOne("ArtPlatform.Database.Entities.User", "User")
.WithOne("UserSellerProfile")
.HasForeignKey("ArtPlatform.Database.Entities.UserSellerProfile", "UserId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("User");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerServiceOrder", b =>
{
b.Navigation("Messages");
b.Navigation("Reviews");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.User", b =>
{
b.Navigation("Orders");
b.Navigation("UserSellerProfile");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.UserSellerProfile", b =>
{
b.Navigation("PortfolioPieces");
b.Navigation("SellerServices");
});
#pragma warning restore 612, 618
}
}
}

View File

@ -0,0 +1,50 @@
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace ArtPlatform.Database.Migrations
{
/// <inheritdoc />
public partial class updatess : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.AddColumn<int>(
name: "SellerServiceId",
table: "SellerServiceOrderReviews",
type: "integer",
nullable: false,
defaultValue: 0);
migrationBuilder.CreateIndex(
name: "IX_SellerServiceOrderReviews_SellerServiceId",
table: "SellerServiceOrderReviews",
column: "SellerServiceId");
migrationBuilder.AddForeignKey(
name: "FK_SellerServiceOrderReviews_SellerServices_SellerServiceId",
table: "SellerServiceOrderReviews",
column: "SellerServiceId",
principalTable: "SellerServices",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropForeignKey(
name: "FK_SellerServiceOrderReviews_SellerServices_SellerServiceId",
table: "SellerServiceOrderReviews");
migrationBuilder.DropIndex(
name: "IX_SellerServiceOrderReviews_SellerServiceId",
table: "SellerServiceOrderReviews");
migrationBuilder.DropColumn(
name: "SellerServiceId",
table: "SellerServiceOrderReviews");
}
}
}

View File

@ -0,0 +1,466 @@
// <auto-generated />
using System;
using System.Collections.Generic;
using ArtPlatform.Database;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
#nullable disable
namespace ArtPlatform.Database.Migrations
{
[DbContext(typeof(ApplicationDbContext))]
[Migration("20240127080610_lmaomore")]
partial class lmaomore
{
/// <inheritdoc />
protected override void BuildTargetModel(ModelBuilder modelBuilder)
{
#pragma warning disable 612, 618
modelBuilder
.HasAnnotation("ProductVersion", "8.0.1")
.HasAnnotation("Relational:MaxIdentifierLength", 63);
NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerProfilePortfolioPiece", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<string>("Description")
.IsRequired()
.HasColumnType("text");
b.Property<string>("FileReference")
.HasColumnType("text");
b.Property<string>("Name")
.IsRequired()
.HasColumnType("text");
b.Property<int>("SellerProfileId")
.HasColumnType("integer");
b.HasKey("Id");
b.HasIndex("SellerProfileId");
b.ToTable("SellerProfilePortfolioPieces");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerProfileRequest", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<bool>("Accepted")
.HasColumnType("boolean");
b.Property<DateTime?>("AcceptedDate")
.HasColumnType("timestamp with time zone");
b.Property<DateTime>("RequestDate")
.HasColumnType("timestamp with time zone");
b.Property<string>("UserId")
.IsRequired()
.HasColumnType("text");
b.HasKey("Id");
b.HasIndex("UserId");
b.ToTable("SellerProfileRequests");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerService", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<string>("Description")
.IsRequired()
.HasColumnType("text");
b.Property<string>("Name")
.IsRequired()
.HasColumnType("text");
b.Property<decimal>("Price")
.HasColumnType("numeric");
b.Property<int>("SellerProfileId")
.HasColumnType("integer");
b.HasKey("Id");
b.HasIndex("SellerProfileId");
b.ToTable("SellerServices");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerServiceOrder", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<string>("BuyerId")
.IsRequired()
.HasColumnType("text");
b.Property<int>("SellerServiceId")
.HasColumnType("integer");
b.Property<int>("Status")
.HasColumnType("integer");
b.HasKey("Id");
b.HasIndex("BuyerId");
b.HasIndex("SellerServiceId");
b.ToTable("SellerServiceOrders");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerServiceOrderMessage", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<string>("Message")
.IsRequired()
.HasColumnType("text");
b.Property<int>("SellerServiceOrderId")
.HasColumnType("integer");
b.Property<string>("SenderId")
.IsRequired()
.HasColumnType("text");
b.Property<DateTime>("SentAt")
.HasColumnType("timestamp with time zone");
b.HasKey("Id");
b.HasIndex("SellerServiceOrderId");
b.HasIndex("SenderId");
b.ToTable("SellerServiceOrderMessages");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerServiceOrderMessageAttachment", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<string>("FileReference")
.IsRequired()
.HasColumnType("text");
b.Property<int>("SellerServiceOrderMessageId")
.HasColumnType("integer");
b.HasKey("Id");
b.HasIndex("SellerServiceOrderMessageId");
b.ToTable("SellerServiceOrderMessageAttachments");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerServiceOrderReview", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<int>("Rating")
.HasColumnType("integer");
b.Property<string>("Review")
.HasColumnType("text");
b.Property<string>("ReviewerId")
.IsRequired()
.HasColumnType("text");
b.Property<int>("SellerServiceId")
.HasColumnType("integer");
b.Property<int>("SellerServiceOrderId")
.HasColumnType("integer");
b.HasKey("Id");
b.HasIndex("ReviewerId");
b.HasIndex("SellerServiceId");
b.HasIndex("SellerServiceOrderId");
b.ToTable("SellerServiceOrderReviews");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.User", b =>
{
b.Property<string>("Id")
.HasColumnType("text");
b.Property<string>("AddressCity")
.IsRequired()
.HasColumnType("text");
b.Property<string>("AddressCountry")
.IsRequired()
.HasColumnType("text");
b.Property<string>("AddressHouseNumber")
.IsRequired()
.HasColumnType("text");
b.Property<string>("AddressPostalCode")
.IsRequired()
.HasColumnType("text");
b.Property<string>("AddressRegion")
.IsRequired()
.HasColumnType("text");
b.Property<string>("AddressStreet")
.IsRequired()
.HasColumnType("text");
b.Property<string>("Biography")
.IsRequired()
.HasColumnType("text");
b.Property<string>("DisplayName")
.IsRequired()
.HasColumnType("text");
b.Property<string>("Email")
.IsRequired()
.HasColumnType("text");
b.Property<string>("FirstName")
.IsRequired()
.HasColumnType("text");
b.Property<string>("LastName")
.IsRequired()
.HasColumnType("text");
b.Property<int?>("UserSellerProfileId")
.HasColumnType("integer");
b.HasKey("Id");
b.ToTable("Users");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.UserSellerProfile", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<bool>("AgeRestricted")
.HasColumnType("boolean");
b.Property<string>("Biography")
.IsRequired()
.HasColumnType("text");
b.Property<List<string>>("SocialMediaLinks")
.IsRequired()
.HasColumnType("text[]");
b.Property<string>("UserId")
.IsRequired()
.HasColumnType("text");
b.HasKey("Id");
b.HasIndex("UserId")
.IsUnique();
b.ToTable("UserSellerProfiles");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerProfilePortfolioPiece", b =>
{
b.HasOne("ArtPlatform.Database.Entities.UserSellerProfile", "SellerProfile")
.WithMany("PortfolioPieces")
.HasForeignKey("SellerProfileId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("SellerProfile");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerProfileRequest", b =>
{
b.HasOne("ArtPlatform.Database.Entities.User", "User")
.WithMany()
.HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("User");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerService", b =>
{
b.HasOne("ArtPlatform.Database.Entities.UserSellerProfile", "SellerProfile")
.WithMany("SellerServices")
.HasForeignKey("SellerProfileId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("SellerProfile");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerServiceOrder", b =>
{
b.HasOne("ArtPlatform.Database.Entities.User", "Buyer")
.WithMany("Orders")
.HasForeignKey("BuyerId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("ArtPlatform.Database.Entities.SellerService", "SellerService")
.WithMany()
.HasForeignKey("SellerServiceId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("Buyer");
b.Navigation("SellerService");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerServiceOrderMessage", b =>
{
b.HasOne("ArtPlatform.Database.Entities.SellerServiceOrder", "SellerServiceOrder")
.WithMany("Messages")
.HasForeignKey("SellerServiceOrderId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("ArtPlatform.Database.Entities.User", "Sender")
.WithMany()
.HasForeignKey("SenderId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("SellerServiceOrder");
b.Navigation("Sender");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerServiceOrderMessageAttachment", b =>
{
b.HasOne("ArtPlatform.Database.Entities.SellerServiceOrderMessage", "SellerServiceOrderMessage")
.WithMany()
.HasForeignKey("SellerServiceOrderMessageId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("SellerServiceOrderMessage");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerServiceOrderReview", b =>
{
b.HasOne("ArtPlatform.Database.Entities.User", "Reviewer")
.WithMany()
.HasForeignKey("ReviewerId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("ArtPlatform.Database.Entities.SellerService", "SellerService")
.WithMany("Reviews")
.HasForeignKey("SellerServiceId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("ArtPlatform.Database.Entities.SellerServiceOrder", "SellerServiceOrder")
.WithMany("Reviews")
.HasForeignKey("SellerServiceOrderId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("Reviewer");
b.Navigation("SellerService");
b.Navigation("SellerServiceOrder");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.UserSellerProfile", b =>
{
b.HasOne("ArtPlatform.Database.Entities.User", "User")
.WithOne("UserSellerProfile")
.HasForeignKey("ArtPlatform.Database.Entities.UserSellerProfile", "UserId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("User");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerService", b =>
{
b.Navigation("Reviews");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerServiceOrder", b =>
{
b.Navigation("Messages");
b.Navigation("Reviews");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.User", b =>
{
b.Navigation("Orders");
b.Navigation("UserSellerProfile");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.UserSellerProfile", b =>
{
b.Navigation("PortfolioPieces");
b.Navigation("SellerServices");
});
#pragma warning restore 612, 618
}
}
}

View File

@ -0,0 +1,39 @@
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace ArtPlatform.Database.Migrations
{
/// <inheritdoc />
public partial class lmaomore : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropColumn(
name: "DepositAmount",
table: "SellerServices");
migrationBuilder.DropColumn(
name: "DepositRequired",
table: "SellerServices");
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.AddColumn<decimal>(
name: "DepositAmount",
table: "SellerServices",
type: "numeric",
nullable: true);
migrationBuilder.AddColumn<bool>(
name: "DepositRequired",
table: "SellerServices",
type: "boolean",
nullable: false,
defaultValue: false);
}
}
}

View File

@ -0,0 +1,488 @@
// <auto-generated />
using System;
using System.Collections.Generic;
using ArtPlatform.Database;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
#nullable disable
namespace ArtPlatform.Database.Migrations
{
[DbContext(typeof(ApplicationDbContext))]
[Migration("20240127091953_enddate")]
partial class enddate
{
/// <inheritdoc />
protected override void BuildTargetModel(ModelBuilder modelBuilder)
{
#pragma warning disable 612, 618
modelBuilder
.HasAnnotation("ProductVersion", "8.0.1")
.HasAnnotation("Relational:MaxIdentifierLength", 63);
NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerProfilePortfolioPiece", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<string>("Description")
.IsRequired()
.HasColumnType("text");
b.Property<string>("FileReference")
.HasColumnType("text");
b.Property<string>("Name")
.IsRequired()
.HasColumnType("text");
b.Property<int>("SellerProfileId")
.HasColumnType("integer");
b.HasKey("Id");
b.HasIndex("SellerProfileId");
b.ToTable("SellerProfilePortfolioPieces");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerProfileRequest", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<bool>("Accepted")
.HasColumnType("boolean");
b.Property<DateTime?>("AcceptedDate")
.HasColumnType("timestamp with time zone");
b.Property<DateTime>("RequestDate")
.HasColumnType("timestamp with time zone");
b.Property<string>("UserId")
.IsRequired()
.HasColumnType("text");
b.HasKey("Id");
b.HasIndex("UserId");
b.ToTable("SellerProfileRequests");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerService", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<string>("Description")
.IsRequired()
.HasColumnType("text");
b.Property<string>("Name")
.IsRequired()
.HasColumnType("text");
b.Property<double>("Price")
.HasColumnType("double precision");
b.Property<int>("SellerProfileId")
.HasColumnType("integer");
b.HasKey("Id");
b.HasIndex("SellerProfileId");
b.ToTable("SellerServices");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerServiceOrder", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<string>("BuyerId")
.IsRequired()
.HasColumnType("text");
b.Property<DateTime>("CreatedDate")
.HasColumnType("timestamp with time zone");
b.Property<DateTime?>("EndDate")
.HasColumnType("timestamp with time zone");
b.Property<double>("Price")
.HasColumnType("double precision");
b.Property<int>("SellerId")
.HasColumnType("integer");
b.Property<int>("SellerServiceId")
.HasColumnType("integer");
b.Property<int>("Status")
.HasColumnType("integer");
b.HasKey("Id");
b.HasIndex("BuyerId");
b.HasIndex("SellerId");
b.HasIndex("SellerServiceId");
b.ToTable("SellerServiceOrders");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerServiceOrderMessage", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<string>("Message")
.IsRequired()
.HasColumnType("text");
b.Property<int>("SellerServiceOrderId")
.HasColumnType("integer");
b.Property<string>("SenderId")
.IsRequired()
.HasColumnType("text");
b.Property<DateTime>("SentAt")
.HasColumnType("timestamp with time zone");
b.HasKey("Id");
b.HasIndex("SellerServiceOrderId");
b.HasIndex("SenderId");
b.ToTable("SellerServiceOrderMessages");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerServiceOrderMessageAttachment", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<string>("FileReference")
.IsRequired()
.HasColumnType("text");
b.Property<int>("SellerServiceOrderMessageId")
.HasColumnType("integer");
b.HasKey("Id");
b.HasIndex("SellerServiceOrderMessageId");
b.ToTable("SellerServiceOrderMessageAttachments");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerServiceOrderReview", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<int>("Rating")
.HasColumnType("integer");
b.Property<string>("Review")
.HasColumnType("text");
b.Property<string>("ReviewerId")
.IsRequired()
.HasColumnType("text");
b.Property<int>("SellerServiceId")
.HasColumnType("integer");
b.Property<int>("SellerServiceOrderId")
.HasColumnType("integer");
b.HasKey("Id");
b.HasIndex("ReviewerId");
b.HasIndex("SellerServiceId");
b.HasIndex("SellerServiceOrderId");
b.ToTable("SellerServiceOrderReviews");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.User", b =>
{
b.Property<string>("Id")
.HasColumnType("text");
b.Property<string>("AddressCity")
.IsRequired()
.HasColumnType("text");
b.Property<string>("AddressCountry")
.IsRequired()
.HasColumnType("text");
b.Property<string>("AddressHouseNumber")
.IsRequired()
.HasColumnType("text");
b.Property<string>("AddressPostalCode")
.IsRequired()
.HasColumnType("text");
b.Property<string>("AddressRegion")
.IsRequired()
.HasColumnType("text");
b.Property<string>("AddressStreet")
.IsRequired()
.HasColumnType("text");
b.Property<string>("Biography")
.IsRequired()
.HasColumnType("text");
b.Property<string>("DisplayName")
.IsRequired()
.HasColumnType("text");
b.Property<string>("Email")
.IsRequired()
.HasColumnType("text");
b.Property<string>("FirstName")
.IsRequired()
.HasColumnType("text");
b.Property<string>("LastName")
.IsRequired()
.HasColumnType("text");
b.Property<int?>("UserSellerProfileId")
.HasColumnType("integer");
b.HasKey("Id");
b.ToTable("Users");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.UserSellerProfile", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<bool>("AgeRestricted")
.HasColumnType("boolean");
b.Property<string>("Biography")
.IsRequired()
.HasColumnType("text");
b.Property<List<string>>("SocialMediaLinks")
.IsRequired()
.HasColumnType("text[]");
b.Property<string>("UserId")
.IsRequired()
.HasColumnType("text");
b.HasKey("Id");
b.HasIndex("UserId")
.IsUnique();
b.ToTable("UserSellerProfiles");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerProfilePortfolioPiece", b =>
{
b.HasOne("ArtPlatform.Database.Entities.UserSellerProfile", "SellerProfile")
.WithMany("PortfolioPieces")
.HasForeignKey("SellerProfileId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("SellerProfile");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerProfileRequest", b =>
{
b.HasOne("ArtPlatform.Database.Entities.User", "User")
.WithMany()
.HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("User");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerService", b =>
{
b.HasOne("ArtPlatform.Database.Entities.UserSellerProfile", "SellerProfile")
.WithMany("SellerServices")
.HasForeignKey("SellerProfileId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("SellerProfile");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerServiceOrder", b =>
{
b.HasOne("ArtPlatform.Database.Entities.User", "Buyer")
.WithMany("Orders")
.HasForeignKey("BuyerId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("ArtPlatform.Database.Entities.UserSellerProfile", "Seller")
.WithMany()
.HasForeignKey("SellerId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("ArtPlatform.Database.Entities.SellerService", "SellerService")
.WithMany()
.HasForeignKey("SellerServiceId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("Buyer");
b.Navigation("Seller");
b.Navigation("SellerService");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerServiceOrderMessage", b =>
{
b.HasOne("ArtPlatform.Database.Entities.SellerServiceOrder", "SellerServiceOrder")
.WithMany("Messages")
.HasForeignKey("SellerServiceOrderId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("ArtPlatform.Database.Entities.User", "Sender")
.WithMany()
.HasForeignKey("SenderId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("SellerServiceOrder");
b.Navigation("Sender");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerServiceOrderMessageAttachment", b =>
{
b.HasOne("ArtPlatform.Database.Entities.SellerServiceOrderMessage", "SellerServiceOrderMessage")
.WithMany()
.HasForeignKey("SellerServiceOrderMessageId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("SellerServiceOrderMessage");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerServiceOrderReview", b =>
{
b.HasOne("ArtPlatform.Database.Entities.User", "Reviewer")
.WithMany()
.HasForeignKey("ReviewerId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("ArtPlatform.Database.Entities.SellerService", "SellerService")
.WithMany("Reviews")
.HasForeignKey("SellerServiceId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("ArtPlatform.Database.Entities.SellerServiceOrder", "SellerServiceOrder")
.WithMany("Reviews")
.HasForeignKey("SellerServiceOrderId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("Reviewer");
b.Navigation("SellerService");
b.Navigation("SellerServiceOrder");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.UserSellerProfile", b =>
{
b.HasOne("ArtPlatform.Database.Entities.User", "User")
.WithOne("UserSellerProfile")
.HasForeignKey("ArtPlatform.Database.Entities.UserSellerProfile", "UserId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("User");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerService", b =>
{
b.Navigation("Reviews");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerServiceOrder", b =>
{
b.Navigation("Messages");
b.Navigation("Reviews");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.User", b =>
{
b.Navigation("Orders");
b.Navigation("UserSellerProfile");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.UserSellerProfile", b =>
{
b.Navigation("PortfolioPieces");
b.Navigation("SellerServices");
});
#pragma warning restore 612, 618
}
}
}

View File

@ -0,0 +1,99 @@
using System;
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace ArtPlatform.Database.Migrations
{
/// <inheritdoc />
public partial class enddate : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.AlterColumn<double>(
name: "Price",
table: "SellerServices",
type: "double precision",
nullable: false,
oldClrType: typeof(decimal),
oldType: "numeric");
migrationBuilder.AddColumn<DateTime>(
name: "CreatedDate",
table: "SellerServiceOrders",
type: "timestamp with time zone",
nullable: false,
defaultValue: new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified));
migrationBuilder.AddColumn<DateTime>(
name: "EndDate",
table: "SellerServiceOrders",
type: "timestamp with time zone",
nullable: true);
migrationBuilder.AddColumn<double>(
name: "Price",
table: "SellerServiceOrders",
type: "double precision",
nullable: false,
defaultValue: 0.0);
migrationBuilder.AddColumn<int>(
name: "SellerId",
table: "SellerServiceOrders",
type: "integer",
nullable: false,
defaultValue: 0);
migrationBuilder.CreateIndex(
name: "IX_SellerServiceOrders_SellerId",
table: "SellerServiceOrders",
column: "SellerId");
migrationBuilder.AddForeignKey(
name: "FK_SellerServiceOrders_UserSellerProfiles_SellerId",
table: "SellerServiceOrders",
column: "SellerId",
principalTable: "UserSellerProfiles",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropForeignKey(
name: "FK_SellerServiceOrders_UserSellerProfiles_SellerId",
table: "SellerServiceOrders");
migrationBuilder.DropIndex(
name: "IX_SellerServiceOrders_SellerId",
table: "SellerServiceOrders");
migrationBuilder.DropColumn(
name: "CreatedDate",
table: "SellerServiceOrders");
migrationBuilder.DropColumn(
name: "EndDate",
table: "SellerServiceOrders");
migrationBuilder.DropColumn(
name: "Price",
table: "SellerServiceOrders");
migrationBuilder.DropColumn(
name: "SellerId",
table: "SellerServiceOrders");
migrationBuilder.AlterColumn<decimal>(
name: "Price",
table: "SellerServices",
type: "numeric",
nullable: false,
oldClrType: typeof(double),
oldType: "double precision");
}
}
}

View File

@ -0,0 +1,491 @@
// <auto-generated />
using System;
using System.Collections.Generic;
using ArtPlatform.Database;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
#nullable disable
namespace ArtPlatform.Database.Migrations
{
[DbContext(typeof(ApplicationDbContext))]
[Migration("20240127092417_terms")]
partial class terms
{
/// <inheritdoc />
protected override void BuildTargetModel(ModelBuilder modelBuilder)
{
#pragma warning disable 612, 618
modelBuilder
.HasAnnotation("ProductVersion", "8.0.1")
.HasAnnotation("Relational:MaxIdentifierLength", 63);
NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerProfilePortfolioPiece", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<string>("Description")
.IsRequired()
.HasColumnType("text");
b.Property<string>("FileReference")
.HasColumnType("text");
b.Property<string>("Name")
.IsRequired()
.HasColumnType("text");
b.Property<int>("SellerProfileId")
.HasColumnType("integer");
b.HasKey("Id");
b.HasIndex("SellerProfileId");
b.ToTable("SellerProfilePortfolioPieces");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerProfileRequest", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<bool>("Accepted")
.HasColumnType("boolean");
b.Property<DateTime?>("AcceptedDate")
.HasColumnType("timestamp with time zone");
b.Property<DateTime>("RequestDate")
.HasColumnType("timestamp with time zone");
b.Property<string>("UserId")
.IsRequired()
.HasColumnType("text");
b.HasKey("Id");
b.HasIndex("UserId");
b.ToTable("SellerProfileRequests");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerService", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<string>("Description")
.IsRequired()
.HasColumnType("text");
b.Property<string>("Name")
.IsRequired()
.HasColumnType("text");
b.Property<double>("Price")
.HasColumnType("double precision");
b.Property<int>("SellerProfileId")
.HasColumnType("integer");
b.HasKey("Id");
b.HasIndex("SellerProfileId");
b.ToTable("SellerServices");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerServiceOrder", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<string>("BuyerId")
.IsRequired()
.HasColumnType("text");
b.Property<DateTime>("CreatedDate")
.HasColumnType("timestamp with time zone");
b.Property<DateTime?>("EndDate")
.HasColumnType("timestamp with time zone");
b.Property<double>("Price")
.HasColumnType("double precision");
b.Property<int>("SellerId")
.HasColumnType("integer");
b.Property<int>("SellerServiceId")
.HasColumnType("integer");
b.Property<int>("Status")
.HasColumnType("integer");
b.Property<DateTime?>("TermsAcceptedDate")
.HasColumnType("timestamp with time zone");
b.HasKey("Id");
b.HasIndex("BuyerId");
b.HasIndex("SellerId");
b.HasIndex("SellerServiceId");
b.ToTable("SellerServiceOrders");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerServiceOrderMessage", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<string>("Message")
.IsRequired()
.HasColumnType("text");
b.Property<int>("SellerServiceOrderId")
.HasColumnType("integer");
b.Property<string>("SenderId")
.IsRequired()
.HasColumnType("text");
b.Property<DateTime>("SentAt")
.HasColumnType("timestamp with time zone");
b.HasKey("Id");
b.HasIndex("SellerServiceOrderId");
b.HasIndex("SenderId");
b.ToTable("SellerServiceOrderMessages");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerServiceOrderMessageAttachment", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<string>("FileReference")
.IsRequired()
.HasColumnType("text");
b.Property<int>("SellerServiceOrderMessageId")
.HasColumnType("integer");
b.HasKey("Id");
b.HasIndex("SellerServiceOrderMessageId");
b.ToTable("SellerServiceOrderMessageAttachments");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerServiceOrderReview", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<int>("Rating")
.HasColumnType("integer");
b.Property<string>("Review")
.HasColumnType("text");
b.Property<string>("ReviewerId")
.IsRequired()
.HasColumnType("text");
b.Property<int>("SellerServiceId")
.HasColumnType("integer");
b.Property<int>("SellerServiceOrderId")
.HasColumnType("integer");
b.HasKey("Id");
b.HasIndex("ReviewerId");
b.HasIndex("SellerServiceId");
b.HasIndex("SellerServiceOrderId");
b.ToTable("SellerServiceOrderReviews");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.User", b =>
{
b.Property<string>("Id")
.HasColumnType("text");
b.Property<string>("AddressCity")
.IsRequired()
.HasColumnType("text");
b.Property<string>("AddressCountry")
.IsRequired()
.HasColumnType("text");
b.Property<string>("AddressHouseNumber")
.IsRequired()
.HasColumnType("text");
b.Property<string>("AddressPostalCode")
.IsRequired()
.HasColumnType("text");
b.Property<string>("AddressRegion")
.IsRequired()
.HasColumnType("text");
b.Property<string>("AddressStreet")
.IsRequired()
.HasColumnType("text");
b.Property<string>("Biography")
.IsRequired()
.HasColumnType("text");
b.Property<string>("DisplayName")
.IsRequired()
.HasColumnType("text");
b.Property<string>("Email")
.IsRequired()
.HasColumnType("text");
b.Property<string>("FirstName")
.IsRequired()
.HasColumnType("text");
b.Property<string>("LastName")
.IsRequired()
.HasColumnType("text");
b.Property<int?>("UserSellerProfileId")
.HasColumnType("integer");
b.HasKey("Id");
b.ToTable("Users");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.UserSellerProfile", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<bool>("AgeRestricted")
.HasColumnType("boolean");
b.Property<string>("Biography")
.IsRequired()
.HasColumnType("text");
b.Property<List<string>>("SocialMediaLinks")
.IsRequired()
.HasColumnType("text[]");
b.Property<string>("UserId")
.IsRequired()
.HasColumnType("text");
b.HasKey("Id");
b.HasIndex("UserId")
.IsUnique();
b.ToTable("UserSellerProfiles");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerProfilePortfolioPiece", b =>
{
b.HasOne("ArtPlatform.Database.Entities.UserSellerProfile", "SellerProfile")
.WithMany("PortfolioPieces")
.HasForeignKey("SellerProfileId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("SellerProfile");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerProfileRequest", b =>
{
b.HasOne("ArtPlatform.Database.Entities.User", "User")
.WithMany()
.HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("User");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerService", b =>
{
b.HasOne("ArtPlatform.Database.Entities.UserSellerProfile", "SellerProfile")
.WithMany("SellerServices")
.HasForeignKey("SellerProfileId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("SellerProfile");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerServiceOrder", b =>
{
b.HasOne("ArtPlatform.Database.Entities.User", "Buyer")
.WithMany("Orders")
.HasForeignKey("BuyerId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("ArtPlatform.Database.Entities.UserSellerProfile", "Seller")
.WithMany()
.HasForeignKey("SellerId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("ArtPlatform.Database.Entities.SellerService", "SellerService")
.WithMany()
.HasForeignKey("SellerServiceId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("Buyer");
b.Navigation("Seller");
b.Navigation("SellerService");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerServiceOrderMessage", b =>
{
b.HasOne("ArtPlatform.Database.Entities.SellerServiceOrder", "SellerServiceOrder")
.WithMany("Messages")
.HasForeignKey("SellerServiceOrderId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("ArtPlatform.Database.Entities.User", "Sender")
.WithMany()
.HasForeignKey("SenderId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("SellerServiceOrder");
b.Navigation("Sender");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerServiceOrderMessageAttachment", b =>
{
b.HasOne("ArtPlatform.Database.Entities.SellerServiceOrderMessage", "SellerServiceOrderMessage")
.WithMany()
.HasForeignKey("SellerServiceOrderMessageId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("SellerServiceOrderMessage");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerServiceOrderReview", b =>
{
b.HasOne("ArtPlatform.Database.Entities.User", "Reviewer")
.WithMany()
.HasForeignKey("ReviewerId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("ArtPlatform.Database.Entities.SellerService", "SellerService")
.WithMany("Reviews")
.HasForeignKey("SellerServiceId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("ArtPlatform.Database.Entities.SellerServiceOrder", "SellerServiceOrder")
.WithMany("Reviews")
.HasForeignKey("SellerServiceOrderId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("Reviewer");
b.Navigation("SellerService");
b.Navigation("SellerServiceOrder");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.UserSellerProfile", b =>
{
b.HasOne("ArtPlatform.Database.Entities.User", "User")
.WithOne("UserSellerProfile")
.HasForeignKey("ArtPlatform.Database.Entities.UserSellerProfile", "UserId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("User");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerService", b =>
{
b.Navigation("Reviews");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerServiceOrder", b =>
{
b.Navigation("Messages");
b.Navigation("Reviews");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.User", b =>
{
b.Navigation("Orders");
b.Navigation("UserSellerProfile");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.UserSellerProfile", b =>
{
b.Navigation("PortfolioPieces");
b.Navigation("SellerServices");
});
#pragma warning restore 612, 618
}
}
}

View File

@ -0,0 +1,29 @@
using System;
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace ArtPlatform.Database.Migrations
{
/// <inheritdoc />
public partial class terms : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.AddColumn<DateTime>(
name: "TermsAcceptedDate",
table: "SellerServiceOrders",
type: "timestamp with time zone",
nullable: true);
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropColumn(
name: "TermsAcceptedDate",
table: "SellerServiceOrders");
}
}
}

View File

@ -0,0 +1,491 @@
// <auto-generated />
using System;
using System.Collections.Generic;
using ArtPlatform.Database;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
#nullable disable
namespace ArtPlatform.Database.Migrations
{
[DbContext(typeof(ApplicationDbContext))]
[Migration("20240127093942_makesure")]
partial class makesure
{
/// <inheritdoc />
protected override void BuildTargetModel(ModelBuilder modelBuilder)
{
#pragma warning disable 612, 618
modelBuilder
.HasAnnotation("ProductVersion", "8.0.1")
.HasAnnotation("Relational:MaxIdentifierLength", 63);
NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerProfilePortfolioPiece", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<string>("Description")
.IsRequired()
.HasColumnType("text");
b.Property<string>("FileReference")
.HasColumnType("text");
b.Property<string>("Name")
.IsRequired()
.HasColumnType("text");
b.Property<int>("SellerProfileId")
.HasColumnType("integer");
b.HasKey("Id");
b.HasIndex("SellerProfileId");
b.ToTable("SellerProfilePortfolioPieces");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerProfileRequest", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<bool>("Accepted")
.HasColumnType("boolean");
b.Property<DateTime?>("AcceptedDate")
.HasColumnType("timestamp with time zone");
b.Property<DateTime>("RequestDate")
.HasColumnType("timestamp with time zone");
b.Property<string>("UserId")
.IsRequired()
.HasColumnType("text");
b.HasKey("Id");
b.HasIndex("UserId");
b.ToTable("SellerProfileRequests");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerService", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<string>("Description")
.IsRequired()
.HasColumnType("text");
b.Property<string>("Name")
.IsRequired()
.HasColumnType("text");
b.Property<double>("Price")
.HasColumnType("double precision");
b.Property<int>("SellerProfileId")
.HasColumnType("integer");
b.HasKey("Id");
b.HasIndex("SellerProfileId");
b.ToTable("SellerServices");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerServiceOrder", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<string>("BuyerId")
.IsRequired()
.HasColumnType("text");
b.Property<DateTime>("CreatedDate")
.HasColumnType("timestamp with time zone");
b.Property<DateTime?>("EndDate")
.HasColumnType("timestamp with time zone");
b.Property<double>("Price")
.HasColumnType("double precision");
b.Property<int>("SellerId")
.HasColumnType("integer");
b.Property<int>("SellerServiceId")
.HasColumnType("integer");
b.Property<int>("Status")
.HasColumnType("integer");
b.Property<DateTime?>("TermsAcceptedDate")
.HasColumnType("timestamp with time zone");
b.HasKey("Id");
b.HasIndex("BuyerId");
b.HasIndex("SellerId");
b.HasIndex("SellerServiceId");
b.ToTable("SellerServiceOrders");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerServiceOrderMessage", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<string>("Message")
.IsRequired()
.HasColumnType("text");
b.Property<int>("SellerServiceOrderId")
.HasColumnType("integer");
b.Property<string>("SenderId")
.IsRequired()
.HasColumnType("text");
b.Property<DateTime>("SentAt")
.HasColumnType("timestamp with time zone");
b.HasKey("Id");
b.HasIndex("SellerServiceOrderId");
b.HasIndex("SenderId");
b.ToTable("SellerServiceOrderMessages");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerServiceOrderMessageAttachment", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<string>("FileReference")
.IsRequired()
.HasColumnType("text");
b.Property<int>("SellerServiceOrderMessageId")
.HasColumnType("integer");
b.HasKey("Id");
b.HasIndex("SellerServiceOrderMessageId");
b.ToTable("SellerServiceOrderMessageAttachments");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerServiceOrderReview", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<int>("Rating")
.HasColumnType("integer");
b.Property<string>("Review")
.HasColumnType("text");
b.Property<string>("ReviewerId")
.IsRequired()
.HasColumnType("text");
b.Property<int>("SellerServiceId")
.HasColumnType("integer");
b.Property<int>("SellerServiceOrderId")
.HasColumnType("integer");
b.HasKey("Id");
b.HasIndex("ReviewerId");
b.HasIndex("SellerServiceId");
b.HasIndex("SellerServiceOrderId");
b.ToTable("SellerServiceOrderReviews");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.User", b =>
{
b.Property<string>("Id")
.HasColumnType("text");
b.Property<string>("AddressCity")
.IsRequired()
.HasColumnType("text");
b.Property<string>("AddressCountry")
.IsRequired()
.HasColumnType("text");
b.Property<string>("AddressHouseNumber")
.IsRequired()
.HasColumnType("text");
b.Property<string>("AddressPostalCode")
.IsRequired()
.HasColumnType("text");
b.Property<string>("AddressRegion")
.IsRequired()
.HasColumnType("text");
b.Property<string>("AddressStreet")
.IsRequired()
.HasColumnType("text");
b.Property<string>("Biography")
.IsRequired()
.HasColumnType("text");
b.Property<string>("DisplayName")
.IsRequired()
.HasColumnType("text");
b.Property<string>("Email")
.IsRequired()
.HasColumnType("text");
b.Property<string>("FirstName")
.IsRequired()
.HasColumnType("text");
b.Property<string>("LastName")
.IsRequired()
.HasColumnType("text");
b.Property<int?>("UserSellerProfileId")
.HasColumnType("integer");
b.HasKey("Id");
b.ToTable("Users");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.UserSellerProfile", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<bool>("AgeRestricted")
.HasColumnType("boolean");
b.Property<string>("Biography")
.IsRequired()
.HasColumnType("text");
b.Property<List<string>>("SocialMediaLinks")
.IsRequired()
.HasColumnType("text[]");
b.Property<string>("UserId")
.IsRequired()
.HasColumnType("text");
b.HasKey("Id");
b.HasIndex("UserId")
.IsUnique();
b.ToTable("UserSellerProfiles");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerProfilePortfolioPiece", b =>
{
b.HasOne("ArtPlatform.Database.Entities.UserSellerProfile", "SellerProfile")
.WithMany("PortfolioPieces")
.HasForeignKey("SellerProfileId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("SellerProfile");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerProfileRequest", b =>
{
b.HasOne("ArtPlatform.Database.Entities.User", "User")
.WithMany()
.HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("User");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerService", b =>
{
b.HasOne("ArtPlatform.Database.Entities.UserSellerProfile", "SellerProfile")
.WithMany("SellerServices")
.HasForeignKey("SellerProfileId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("SellerProfile");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerServiceOrder", b =>
{
b.HasOne("ArtPlatform.Database.Entities.User", "Buyer")
.WithMany("Orders")
.HasForeignKey("BuyerId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("ArtPlatform.Database.Entities.UserSellerProfile", "Seller")
.WithMany()
.HasForeignKey("SellerId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("ArtPlatform.Database.Entities.SellerService", "SellerService")
.WithMany()
.HasForeignKey("SellerServiceId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("Buyer");
b.Navigation("Seller");
b.Navigation("SellerService");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerServiceOrderMessage", b =>
{
b.HasOne("ArtPlatform.Database.Entities.SellerServiceOrder", "SellerServiceOrder")
.WithMany("Messages")
.HasForeignKey("SellerServiceOrderId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("ArtPlatform.Database.Entities.User", "Sender")
.WithMany()
.HasForeignKey("SenderId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("SellerServiceOrder");
b.Navigation("Sender");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerServiceOrderMessageAttachment", b =>
{
b.HasOne("ArtPlatform.Database.Entities.SellerServiceOrderMessage", "SellerServiceOrderMessage")
.WithMany()
.HasForeignKey("SellerServiceOrderMessageId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("SellerServiceOrderMessage");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerServiceOrderReview", b =>
{
b.HasOne("ArtPlatform.Database.Entities.User", "Reviewer")
.WithMany()
.HasForeignKey("ReviewerId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("ArtPlatform.Database.Entities.SellerService", "SellerService")
.WithMany("Reviews")
.HasForeignKey("SellerServiceId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("ArtPlatform.Database.Entities.SellerServiceOrder", "SellerServiceOrder")
.WithMany("Reviews")
.HasForeignKey("SellerServiceOrderId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("Reviewer");
b.Navigation("SellerService");
b.Navigation("SellerServiceOrder");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.UserSellerProfile", b =>
{
b.HasOne("ArtPlatform.Database.Entities.User", "User")
.WithOne("UserSellerProfile")
.HasForeignKey("ArtPlatform.Database.Entities.UserSellerProfile", "UserId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("User");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerService", b =>
{
b.Navigation("Reviews");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.SellerServiceOrder", b =>
{
b.Navigation("Messages");
b.Navigation("Reviews");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.User", b =>
{
b.Navigation("Orders");
b.Navigation("UserSellerProfile");
});
modelBuilder.Entity("ArtPlatform.Database.Entities.UserSellerProfile", b =>
{
b.Navigation("PortfolioPieces");
b.Navigation("SellerServices");
});
#pragma warning restore 612, 618
}
}
}

Some files were not shown because too many files have changed in this diff Show More