From 092941f77805ffd12a015ff2afa90e542cbe6cc1 Mon Sep 17 00:00:00 2001 From: Damien Ostler Date: Sun, 25 Feb 2024 15:29:46 -0500 Subject: [PATCH] feat: reference and asset images on requests --- .../ApplicationDbContext.cs | 2 + .../Controllers/RequestsController.cs | 119 ++++ .../Entities/ArtistRequest.cs | 3 + src/comissions.app.api/Entities/Request.cs | 3 + .../Entities/RequestAsset.cs | 9 + .../Entities/RequestReference.cs | 9 + .../20240225081932_review.Designer.cs | 504 +++++++++++++++ .../Migrations/20240225081932_review.cs | 49 ++ .../20240225202343_request stuff.Designer.cs | 577 ++++++++++++++++++ .../20240225202343_request stuff.cs | 75 +++ .../ApplicationDbContextModelSnapshot.cs | 86 ++- .../Models/Request/RequestImageModel.cs | 7 + .../Models/Request/RequestModelExtensions.cs | 16 + 13 files changed, 1458 insertions(+), 1 deletion(-) create mode 100644 src/comissions.app.api/Entities/RequestAsset.cs create mode 100644 src/comissions.app.api/Entities/RequestReference.cs create mode 100644 src/comissions.app.api/Migrations/20240225081932_review.Designer.cs create mode 100644 src/comissions.app.api/Migrations/20240225081932_review.cs create mode 100644 src/comissions.app.api/Migrations/20240225202343_request stuff.Designer.cs create mode 100644 src/comissions.app.api/Migrations/20240225202343_request stuff.cs create mode 100644 src/comissions.app.api/Models/Request/RequestImageModel.cs diff --git a/src/comissions.app.api/ApplicationDbContext.cs b/src/comissions.app.api/ApplicationDbContext.cs index 62715af..187bb19 100644 --- a/src/comissions.app.api/ApplicationDbContext.cs +++ b/src/comissions.app.api/ApplicationDbContext.cs @@ -46,5 +46,7 @@ public class ApplicationDbContext:DbContext public DbSet ArtistRequests { get; set; }= null!; public DbSet ArtistPortfolioPieces { get; set; }= null!; public DbSet Requests { get; set; }= null!; + public DbSet RequestReferences { get; set; }= null!; + public DbSet RequestAssets { get; set; }= null!; #endregion } \ No newline at end of file diff --git a/src/comissions.app.api/Controllers/RequestsController.cs b/src/comissions.app.api/Controllers/RequestsController.cs index edfd6e0..a125019 100644 --- a/src/comissions.app.api/Controllers/RequestsController.cs +++ b/src/comissions.app.api/Controllers/RequestsController.cs @@ -740,6 +740,125 @@ public class RequestsController : Controller _dbContext.SaveChanges(); return Ok(new {paymentUrl = request.PaymentUrl}); } + + [Authorize("write:request")] + [HttpPost] + [Route("Customer/{requestId:int}/Reference")] + public async Task AddRefrence(int requestId, List referenceImages) + { + var userId = User.GetUserId(); + var request = await _dbContext.Requests + .Where(x=>x.UserId==userId) + .FirstOrDefaultAsync(x=>x.Id==requestId); + if(request==null) + return NotFound(); + var references = new List(); + foreach (var file in referenceImages) + { + var reference = new RequestReference() + { + RequestId = requestId, + FileReference = await _storageService.UploadImageAsync(file.OpenReadStream(), Guid.NewGuid().ToString()) + }; + references.Add(reference); + } + _dbContext.RequestReferences.AddRange(references); + await _dbContext.SaveChangesAsync(); + return Ok(); + } + [Authorize("write:request")] + [HttpPost] + [Route("Artist/{requestId:int}/Asset")] + public async Task AddAsset(int requestId, List assetImages) + { + var userId = User.GetUserId(); + var request = await _dbContext.Requests + .Where(x=>x.UserId==userId) + .FirstOrDefaultAsync(x=>x.Id==requestId); + if(request==null) + return NotFound(); + var references = new List(); + foreach (var file in assetImages) + { + var reference = new RequestAsset() + { + RequestId = requestId, + FileReference = await _storageService.UploadImageAsync(file.OpenReadStream(), Guid.NewGuid().ToString()) + }; + references.Add(reference); + } + _dbContext.RequestAssets.AddRange(references); + await _dbContext.SaveChangesAsync(); + return Ok(); + } + + [HttpGet] + [Route("Customer/{requestId:int}/Reference")] + public async Task GetReferences(int requestId) + { + var userId = User.GetUserId(); + var request = await _dbContext.Requests + .Where(x=>x.UserId==userId) + .FirstOrDefaultAsync(x=>x.Id==requestId); + if(request==null) + return NotFound(); + var references = await _dbContext.RequestReferences + .Where(x=>x.RequestId==requestId) + .ToListAsync(); + var result = references.Select(x=>x.ToModel()).ToList(); + return Ok(result); + } + + [HttpGet] + [Route("Customer/{requestId:int}/Asset")] + public async Task GetAssets(int requestId) + { + var userId = User.GetUserId(); + var request = await _dbContext.Requests + .Where(x=>x.UserId==userId) + .FirstOrDefaultAsync(x=>x.Id==requestId); + if(request==null) + return NotFound(); + var references = await _dbContext.RequestAssets + .Where(x=>x.RequestId==requestId) + .ToListAsync(); + var result = references.Select(x=>x.ToModel()).ToList(); + return Ok(result); + } + + [HttpGet] + [Route("Artist/{requestId:int}/Reference")] + public async Task GetArtistReferences(int requestId) + { + var userId = User.GetUserId(); + var request = await _dbContext.Requests + .Where(x=>x.UserId==userId) + .FirstOrDefaultAsync(x=>x.Id==requestId); + if(request==null) + return NotFound(); + var references = await _dbContext.RequestReferences + .Where(x=>x.RequestId==requestId) + .ToListAsync(); + var result = references.Select(x=>x.ToModel()).ToList(); + return Ok(result); + } + + [HttpGet] + [Route("Artist/{requestId:int}/Asset")] + public async Task GetArtistAssets(int requestId) + { + var userId = User.GetUserId(); + var request = await _dbContext.Requests + .Where(x=>x.UserId==userId) + .FirstOrDefaultAsync(x=>x.Id==requestId); + if(request==null) + return NotFound(); + var references = await _dbContext.RequestAssets + .Where(x=>x.RequestId==requestId) + .ToListAsync(); + var result = references.Select(x=>x.ToModel()).ToList(); + return Ok(result); + } [Authorize("read:request")] [HttpGet] diff --git a/src/comissions.app.api/Entities/ArtistRequest.cs b/src/comissions.app.api/Entities/ArtistRequest.cs index e14d333..60fe60a 100644 --- a/src/comissions.app.api/Entities/ArtistRequest.cs +++ b/src/comissions.app.api/Entities/ArtistRequest.cs @@ -8,6 +8,9 @@ public class ArtistRequest public DateTime RequestDate { get; set; } public DateTime? AcceptedDate { get; set; } public bool Accepted { get; set; } + public bool Reviewed { get; set; } + public string? Review { get; set; } + public double? ReviewRating { get; set; } public virtual User User { get; set; } = null!; } \ No newline at end of file diff --git a/src/comissions.app.api/Entities/Request.cs b/src/comissions.app.api/Entities/Request.cs index 681f13b..3770598 100644 --- a/src/comissions.app.api/Entities/Request.cs +++ b/src/comissions.app.api/Entities/Request.cs @@ -20,4 +20,7 @@ public class Request public virtual User User { get; set; } = null!; public virtual UserArtist Artist { get; set; } = null!; + + public virtual ICollection RequestAssets { get; set; } = null!; + public virtual ICollection RequestReferences { get; set; } = null!; } \ No newline at end of file diff --git a/src/comissions.app.api/Entities/RequestAsset.cs b/src/comissions.app.api/Entities/RequestAsset.cs new file mode 100644 index 0000000..4526539 --- /dev/null +++ b/src/comissions.app.api/Entities/RequestAsset.cs @@ -0,0 +1,9 @@ +namespace comissions.app.database.Entities; + +public class RequestAsset +{ + public int Id { get; set; } + public int RequestId { get; set; } + public string FileReference { get; set; } + public virtual Request Request { get; set; } = null!; +} \ No newline at end of file diff --git a/src/comissions.app.api/Entities/RequestReference.cs b/src/comissions.app.api/Entities/RequestReference.cs new file mode 100644 index 0000000..649d720 --- /dev/null +++ b/src/comissions.app.api/Entities/RequestReference.cs @@ -0,0 +1,9 @@ +namespace comissions.app.database.Entities; + +public class RequestReference +{ + public int Id { get; set; } + public int RequestId { get; set; } + public string FileReference { get; set; } + public virtual Request Request { get; set; } = null!; +} \ No newline at end of file diff --git a/src/comissions.app.api/Migrations/20240225081932_review.Designer.cs b/src/comissions.app.api/Migrations/20240225081932_review.Designer.cs new file mode 100644 index 0000000..2152844 --- /dev/null +++ b/src/comissions.app.api/Migrations/20240225081932_review.Designer.cs @@ -0,0 +1,504 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; +using comissions.app.database; + +#nullable disable + +namespace comissions.app.api.Migrations +{ + [DbContext(typeof(ApplicationDbContext))] + [Migration("20240225081932_review")] + partial class review + { + /// + 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("comissions.app.database.Entities.ArtistPageSettings", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ArtistId") + .HasColumnType("integer"); + + b.Property("BackgroundColor") + .IsRequired() + .HasColumnType("text"); + + b.Property("DescriptionBackgroundColor") + .IsRequired() + .HasColumnType("text"); + + b.Property("DescriptionHeaderColor") + .IsRequired() + .HasColumnType("text"); + + b.Property("DescriptionHeaderImageUrl") + .IsRequired() + .HasColumnType("text"); + + b.Property("DescriptionHeaderSize") + .HasColumnType("integer"); + + b.Property("DescriptionHeaderText") + .IsRequired() + .HasColumnType("text"); + + b.Property("DescriptionHeaderUseImage") + .HasColumnType("boolean"); + + b.Property("DescriptionTextColor") + .IsRequired() + .HasColumnType("text"); + + b.Property("DescriptionTextSize") + .HasColumnType("integer"); + + b.Property("HeaderColor") + .IsRequired() + .HasColumnType("text"); + + b.Property("HeaderImageUrl") + .IsRequired() + .HasColumnType("text"); + + b.Property("HeaderTextSize") + .HasColumnType("integer"); + + b.Property("HeaderUseImage") + .HasColumnType("boolean"); + + b.Property("PortfolioBackgroundColor") + .IsRequired() + .HasColumnType("text"); + + b.Property("PortfolioColumns") + .HasColumnType("integer"); + + b.Property("PortfolioEnabledScrolling") + .HasColumnType("boolean"); + + b.Property("PortfolioMasonry") + .HasColumnType("boolean"); + + b.Property("PortfolioMaximumSize") + .HasColumnType("integer"); + + b.Property("PortfolionHeaderColor") + .IsRequired() + .HasColumnType("text"); + + b.Property("PortfolionHeaderImageUrl") + .IsRequired() + .HasColumnType("text"); + + b.Property("PortfolionHeaderSize") + .HasColumnType("integer"); + + b.Property("PortfolionHeaderText") + .IsRequired() + .HasColumnType("text"); + + b.Property("PortfolionHeaderUseImage") + .HasColumnType("boolean"); + + b.Property("RequestBackgroundColor") + .IsRequired() + .HasColumnType("text"); + + b.Property("RequestButtonBGColor") + .IsRequired() + .HasColumnType("text"); + + b.Property("RequestButtonHoverBGColor") + .IsRequired() + .HasColumnType("text"); + + b.Property("RequestButtonHoverTextColor") + .IsRequired() + .HasColumnType("text"); + + b.Property("RequestButtonTextColor") + .IsRequired() + .HasColumnType("text"); + + b.Property("RequestHeaderColor") + .IsRequired() + .HasColumnType("text"); + + b.Property("RequestHeaderImageUrl") + .IsRequired() + .HasColumnType("text"); + + b.Property("RequestHeaderSize") + .HasColumnType("integer"); + + b.Property("RequestHeaderText") + .IsRequired() + .HasColumnType("text"); + + b.Property("RequestHeaderUseImage") + .HasColumnType("boolean"); + + b.Property("RequestTermsColor") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("ArtistId") + .IsUnique(); + + b.ToTable("ArtistPageSettings"); + }); + + modelBuilder.Entity("comissions.app.database.Entities.ArtistPortfolioPiece", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ArtistId") + .HasColumnType("integer"); + + b.Property("FileReference") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("ArtistId"); + + b.ToTable("ArtistPortfolioPieces"); + }); + + modelBuilder.Entity("comissions.app.database.Entities.ArtistRequest", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Accepted") + .HasColumnType("boolean"); + + b.Property("AcceptedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("Message") + .IsRequired() + .HasColumnType("text"); + + b.Property("RequestDate") + .HasColumnType("timestamp with time zone"); + + b.Property("Review") + .HasColumnType("text"); + + b.Property("ReviewRating") + .HasColumnType("double precision"); + + b.Property("Reviewed") + .HasColumnType("boolean"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("ArtistRequests"); + }); + + modelBuilder.Entity("comissions.app.database.Entities.Request", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Accepted") + .HasColumnType("boolean"); + + b.Property("AcceptedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("Amount") + .HasColumnType("numeric"); + + b.Property("ArtistId") + .HasColumnType("integer"); + + b.Property("Completed") + .HasColumnType("boolean"); + + b.Property("CompletedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("Declined") + .HasColumnType("boolean"); + + b.Property("DeclinedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("Message") + .IsRequired() + .HasColumnType("text"); + + b.Property("Paid") + .HasColumnType("boolean"); + + b.Property("PaidDate") + .HasColumnType("timestamp with time zone"); + + b.Property("PaymentUrl") + .HasColumnType("text"); + + b.Property("RequestDate") + .HasColumnType("timestamp with time zone"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("ArtistId"); + + b.HasIndex("UserId"); + + b.ToTable("Requests"); + }); + + modelBuilder.Entity("comissions.app.database.Entities.User", b => + { + b.Property("Id") + .HasColumnType("text"); + + b.Property("BanAdminId") + .HasColumnType("text"); + + b.Property("Banned") + .HasColumnType("boolean"); + + b.Property("BannedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("BannedReason") + .HasColumnType("text"); + + b.Property("Biography") + .IsRequired() + .HasColumnType("text"); + + b.Property("DisplayName") + .IsRequired() + .HasColumnType("text"); + + b.Property("Email") + .IsRequired() + .HasColumnType("text"); + + b.Property("SuspendAdminId") + .HasColumnType("text"); + + b.Property("Suspended") + .HasColumnType("boolean"); + + b.Property("SuspendedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("SuspendedReason") + .HasColumnType("text"); + + b.Property("UnbanDate") + .HasColumnType("timestamp with time zone"); + + b.Property("UnsuspendDate") + .HasColumnType("timestamp with time zone"); + + b.Property("UserArtistId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.ToTable("Users"); + }); + + modelBuilder.Entity("comissions.app.database.Entities.UserArtist", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("AgeRestricted") + .HasColumnType("boolean"); + + b.Property("ArtistPageSettingsId") + .HasColumnType("integer"); + + b.Property("Description") + .IsRequired() + .HasColumnType("text"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text"); + + b.Property("PrepaymentRequired") + .HasColumnType("boolean"); + + b.Property("RequestGuidelines") + .IsRequired() + .HasColumnType("text"); + + b.Property("SocialMediaLink1") + .IsRequired() + .HasColumnType("text"); + + b.Property("SocialMediaLink2") + .IsRequired() + .HasColumnType("text"); + + b.Property("SocialMediaLink3") + .IsRequired() + .HasColumnType("text"); + + b.Property("SocialMediaLink4") + .IsRequired() + .HasColumnType("text"); + + b.Property("StripeAccountId") + .HasColumnType("text"); + + b.Property("SuspendAdminId") + .HasColumnType("text"); + + b.Property("Suspended") + .HasColumnType("boolean"); + + b.Property("SuspendedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("SuspendedReason") + .HasColumnType("text"); + + b.Property("UnsuspendDate") + .HasColumnType("timestamp with time zone"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("UserId") + .IsUnique(); + + b.ToTable("UserArtists"); + }); + + modelBuilder.Entity("comissions.app.database.Entities.ArtistPageSettings", b => + { + b.HasOne("comissions.app.database.Entities.UserArtist", "Artist") + .WithOne("ArtistPageSettings") + .HasForeignKey("comissions.app.database.Entities.ArtistPageSettings", "ArtistId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Artist"); + }); + + modelBuilder.Entity("comissions.app.database.Entities.ArtistPortfolioPiece", b => + { + b.HasOne("comissions.app.database.Entities.UserArtist", "Artist") + .WithMany("PortfolioPieces") + .HasForeignKey("ArtistId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Artist"); + }); + + modelBuilder.Entity("comissions.app.database.Entities.ArtistRequest", b => + { + b.HasOne("comissions.app.database.Entities.User", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + }); + + modelBuilder.Entity("comissions.app.database.Entities.Request", b => + { + b.HasOne("comissions.app.database.Entities.UserArtist", "Artist") + .WithMany("Requests") + .HasForeignKey("ArtistId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("comissions.app.database.Entities.User", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Artist"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("comissions.app.database.Entities.UserArtist", b => + { + b.HasOne("comissions.app.database.Entities.User", "User") + .WithOne("UserArtist") + .HasForeignKey("comissions.app.database.Entities.UserArtist", "UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + }); + + modelBuilder.Entity("comissions.app.database.Entities.User", b => + { + b.Navigation("UserArtist"); + }); + + modelBuilder.Entity("comissions.app.database.Entities.UserArtist", b => + { + b.Navigation("ArtistPageSettings") + .IsRequired(); + + b.Navigation("PortfolioPieces"); + + b.Navigation("Requests"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/src/comissions.app.api/Migrations/20240225081932_review.cs b/src/comissions.app.api/Migrations/20240225081932_review.cs new file mode 100644 index 0000000..3e60720 --- /dev/null +++ b/src/comissions.app.api/Migrations/20240225081932_review.cs @@ -0,0 +1,49 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace comissions.app.api.Migrations +{ + /// + public partial class review : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AddColumn( + name: "Review", + table: "ArtistRequests", + type: "text", + nullable: true); + + migrationBuilder.AddColumn( + name: "ReviewRating", + table: "ArtistRequests", + type: "double precision", + nullable: true); + + migrationBuilder.AddColumn( + name: "Reviewed", + table: "ArtistRequests", + type: "boolean", + nullable: false, + defaultValue: false); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "Review", + table: "ArtistRequests"); + + migrationBuilder.DropColumn( + name: "ReviewRating", + table: "ArtistRequests"); + + migrationBuilder.DropColumn( + name: "Reviewed", + table: "ArtistRequests"); + } + } +} diff --git a/src/comissions.app.api/Migrations/20240225202343_request stuff.Designer.cs b/src/comissions.app.api/Migrations/20240225202343_request stuff.Designer.cs new file mode 100644 index 0000000..a2860cf --- /dev/null +++ b/src/comissions.app.api/Migrations/20240225202343_request stuff.Designer.cs @@ -0,0 +1,577 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; +using comissions.app.database; + +#nullable disable + +namespace comissions.app.api.Migrations +{ + [DbContext(typeof(ApplicationDbContext))] + [Migration("20240225202343_request stuff")] + partial class requeststuff + { + /// + 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("comissions.app.database.Entities.ArtistPageSettings", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ArtistId") + .HasColumnType("integer"); + + b.Property("BackgroundColor") + .IsRequired() + .HasColumnType("text"); + + b.Property("DescriptionBackgroundColor") + .IsRequired() + .HasColumnType("text"); + + b.Property("DescriptionHeaderColor") + .IsRequired() + .HasColumnType("text"); + + b.Property("DescriptionHeaderImageUrl") + .IsRequired() + .HasColumnType("text"); + + b.Property("DescriptionHeaderSize") + .HasColumnType("integer"); + + b.Property("DescriptionHeaderText") + .IsRequired() + .HasColumnType("text"); + + b.Property("DescriptionHeaderUseImage") + .HasColumnType("boolean"); + + b.Property("DescriptionTextColor") + .IsRequired() + .HasColumnType("text"); + + b.Property("DescriptionTextSize") + .HasColumnType("integer"); + + b.Property("HeaderColor") + .IsRequired() + .HasColumnType("text"); + + b.Property("HeaderImageUrl") + .IsRequired() + .HasColumnType("text"); + + b.Property("HeaderTextSize") + .HasColumnType("integer"); + + b.Property("HeaderUseImage") + .HasColumnType("boolean"); + + b.Property("PortfolioBackgroundColor") + .IsRequired() + .HasColumnType("text"); + + b.Property("PortfolioColumns") + .HasColumnType("integer"); + + b.Property("PortfolioEnabledScrolling") + .HasColumnType("boolean"); + + b.Property("PortfolioMasonry") + .HasColumnType("boolean"); + + b.Property("PortfolioMaximumSize") + .HasColumnType("integer"); + + b.Property("PortfolionHeaderColor") + .IsRequired() + .HasColumnType("text"); + + b.Property("PortfolionHeaderImageUrl") + .IsRequired() + .HasColumnType("text"); + + b.Property("PortfolionHeaderSize") + .HasColumnType("integer"); + + b.Property("PortfolionHeaderText") + .IsRequired() + .HasColumnType("text"); + + b.Property("PortfolionHeaderUseImage") + .HasColumnType("boolean"); + + b.Property("RequestBackgroundColor") + .IsRequired() + .HasColumnType("text"); + + b.Property("RequestButtonBGColor") + .IsRequired() + .HasColumnType("text"); + + b.Property("RequestButtonHoverBGColor") + .IsRequired() + .HasColumnType("text"); + + b.Property("RequestButtonHoverTextColor") + .IsRequired() + .HasColumnType("text"); + + b.Property("RequestButtonTextColor") + .IsRequired() + .HasColumnType("text"); + + b.Property("RequestHeaderColor") + .IsRequired() + .HasColumnType("text"); + + b.Property("RequestHeaderImageUrl") + .IsRequired() + .HasColumnType("text"); + + b.Property("RequestHeaderSize") + .HasColumnType("integer"); + + b.Property("RequestHeaderText") + .IsRequired() + .HasColumnType("text"); + + b.Property("RequestHeaderUseImage") + .HasColumnType("boolean"); + + b.Property("RequestTermsColor") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("ArtistId") + .IsUnique(); + + b.ToTable("ArtistPageSettings"); + }); + + modelBuilder.Entity("comissions.app.database.Entities.ArtistPortfolioPiece", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ArtistId") + .HasColumnType("integer"); + + b.Property("FileReference") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("ArtistId"); + + b.ToTable("ArtistPortfolioPieces"); + }); + + modelBuilder.Entity("comissions.app.database.Entities.ArtistRequest", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Accepted") + .HasColumnType("boolean"); + + b.Property("AcceptedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("Message") + .IsRequired() + .HasColumnType("text"); + + b.Property("RequestDate") + .HasColumnType("timestamp with time zone"); + + b.Property("Review") + .HasColumnType("text"); + + b.Property("ReviewRating") + .HasColumnType("double precision"); + + b.Property("Reviewed") + .HasColumnType("boolean"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("ArtistRequests"); + }); + + modelBuilder.Entity("comissions.app.database.Entities.Request", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Accepted") + .HasColumnType("boolean"); + + b.Property("AcceptedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("Amount") + .HasColumnType("numeric"); + + b.Property("ArtistId") + .HasColumnType("integer"); + + b.Property("Completed") + .HasColumnType("boolean"); + + b.Property("CompletedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("Declined") + .HasColumnType("boolean"); + + b.Property("DeclinedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("Message") + .IsRequired() + .HasColumnType("text"); + + b.Property("Paid") + .HasColumnType("boolean"); + + b.Property("PaidDate") + .HasColumnType("timestamp with time zone"); + + b.Property("PaymentUrl") + .HasColumnType("text"); + + b.Property("RequestDate") + .HasColumnType("timestamp with time zone"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("ArtistId"); + + b.HasIndex("UserId"); + + b.ToTable("Requests"); + }); + + modelBuilder.Entity("comissions.app.database.Entities.RequestAsset", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("FileReference") + .IsRequired() + .HasColumnType("text"); + + b.Property("RequestId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("RequestId"); + + b.ToTable("RequestAssets"); + }); + + modelBuilder.Entity("comissions.app.database.Entities.RequestReference", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("FileReference") + .IsRequired() + .HasColumnType("text"); + + b.Property("RequestId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("RequestId"); + + b.ToTable("RequestsReferences"); + }); + + modelBuilder.Entity("comissions.app.database.Entities.User", b => + { + b.Property("Id") + .HasColumnType("text"); + + b.Property("BanAdminId") + .HasColumnType("text"); + + b.Property("Banned") + .HasColumnType("boolean"); + + b.Property("BannedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("BannedReason") + .HasColumnType("text"); + + b.Property("Biography") + .IsRequired() + .HasColumnType("text"); + + b.Property("DisplayName") + .IsRequired() + .HasColumnType("text"); + + b.Property("Email") + .IsRequired() + .HasColumnType("text"); + + b.Property("SuspendAdminId") + .HasColumnType("text"); + + b.Property("Suspended") + .HasColumnType("boolean"); + + b.Property("SuspendedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("SuspendedReason") + .HasColumnType("text"); + + b.Property("UnbanDate") + .HasColumnType("timestamp with time zone"); + + b.Property("UnsuspendDate") + .HasColumnType("timestamp with time zone"); + + b.Property("UserArtistId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.ToTable("Users"); + }); + + modelBuilder.Entity("comissions.app.database.Entities.UserArtist", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("AgeRestricted") + .HasColumnType("boolean"); + + b.Property("ArtistPageSettingsId") + .HasColumnType("integer"); + + b.Property("Description") + .IsRequired() + .HasColumnType("text"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text"); + + b.Property("PrepaymentRequired") + .HasColumnType("boolean"); + + b.Property("RequestGuidelines") + .IsRequired() + .HasColumnType("text"); + + b.Property("SocialMediaLink1") + .IsRequired() + .HasColumnType("text"); + + b.Property("SocialMediaLink2") + .IsRequired() + .HasColumnType("text"); + + b.Property("SocialMediaLink3") + .IsRequired() + .HasColumnType("text"); + + b.Property("SocialMediaLink4") + .IsRequired() + .HasColumnType("text"); + + b.Property("StripeAccountId") + .HasColumnType("text"); + + b.Property("SuspendAdminId") + .HasColumnType("text"); + + b.Property("Suspended") + .HasColumnType("boolean"); + + b.Property("SuspendedDate") + .HasColumnType("timestamp with time zone"); + + b.Property("SuspendedReason") + .HasColumnType("text"); + + b.Property("UnsuspendDate") + .HasColumnType("timestamp with time zone"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("UserId") + .IsUnique(); + + b.ToTable("UserArtists"); + }); + + modelBuilder.Entity("comissions.app.database.Entities.ArtistPageSettings", b => + { + b.HasOne("comissions.app.database.Entities.UserArtist", "Artist") + .WithOne("ArtistPageSettings") + .HasForeignKey("comissions.app.database.Entities.ArtistPageSettings", "ArtistId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Artist"); + }); + + modelBuilder.Entity("comissions.app.database.Entities.ArtistPortfolioPiece", b => + { + b.HasOne("comissions.app.database.Entities.UserArtist", "Artist") + .WithMany("PortfolioPieces") + .HasForeignKey("ArtistId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Artist"); + }); + + modelBuilder.Entity("comissions.app.database.Entities.ArtistRequest", b => + { + b.HasOne("comissions.app.database.Entities.User", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + }); + + modelBuilder.Entity("comissions.app.database.Entities.Request", b => + { + b.HasOne("comissions.app.database.Entities.UserArtist", "Artist") + .WithMany("Requests") + .HasForeignKey("ArtistId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("comissions.app.database.Entities.User", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Artist"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("comissions.app.database.Entities.RequestAsset", b => + { + b.HasOne("comissions.app.database.Entities.Request", "Request") + .WithMany("RequestAssets") + .HasForeignKey("RequestId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Request"); + }); + + modelBuilder.Entity("comissions.app.database.Entities.RequestReference", b => + { + b.HasOne("comissions.app.database.Entities.Request", "Request") + .WithMany("RequestReferences") + .HasForeignKey("RequestId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Request"); + }); + + modelBuilder.Entity("comissions.app.database.Entities.UserArtist", b => + { + b.HasOne("comissions.app.database.Entities.User", "User") + .WithOne("UserArtist") + .HasForeignKey("comissions.app.database.Entities.UserArtist", "UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + }); + + modelBuilder.Entity("comissions.app.database.Entities.Request", b => + { + b.Navigation("RequestAssets"); + + b.Navigation("RequestReferences"); + }); + + modelBuilder.Entity("comissions.app.database.Entities.User", b => + { + b.Navigation("UserArtist"); + }); + + modelBuilder.Entity("comissions.app.database.Entities.UserArtist", b => + { + b.Navigation("ArtistPageSettings") + .IsRequired(); + + b.Navigation("PortfolioPieces"); + + b.Navigation("Requests"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/src/comissions.app.api/Migrations/20240225202343_request stuff.cs b/src/comissions.app.api/Migrations/20240225202343_request stuff.cs new file mode 100644 index 0000000..fdc392b --- /dev/null +++ b/src/comissions.app.api/Migrations/20240225202343_request stuff.cs @@ -0,0 +1,75 @@ +using Microsoft.EntityFrameworkCore.Migrations; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +#nullable disable + +namespace comissions.app.api.Migrations +{ + /// + public partial class requeststuff : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "RequestAssets", + columns: table => new + { + Id = table.Column(type: "integer", nullable: false) + .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), + RequestId = table.Column(type: "integer", nullable: false), + FileReference = table.Column(type: "text", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_RequestAssets", x => x.Id); + table.ForeignKey( + name: "FK_RequestAssets_Requests_RequestId", + column: x => x.RequestId, + principalTable: "Requests", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "RequestsReferences", + columns: table => new + { + Id = table.Column(type: "integer", nullable: false) + .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), + RequestId = table.Column(type: "integer", nullable: false), + FileReference = table.Column(type: "text", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_RequestsReferences", x => x.Id); + table.ForeignKey( + name: "FK_RequestsReferences_Requests_RequestId", + column: x => x.RequestId, + principalTable: "Requests", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateIndex( + name: "IX_RequestAssets_RequestId", + table: "RequestAssets", + column: "RequestId"); + + migrationBuilder.CreateIndex( + name: "IX_RequestsReferences_RequestId", + table: "RequestsReferences", + column: "RequestId"); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "RequestAssets"); + + migrationBuilder.DropTable( + name: "RequestsReferences"); + } + } +} diff --git a/src/comissions.app.api/Migrations/ApplicationDbContextModelSnapshot.cs b/src/comissions.app.api/Migrations/ApplicationDbContextModelSnapshot.cs index df45140..570a55e 100644 --- a/src/comissions.app.api/Migrations/ApplicationDbContextModelSnapshot.cs +++ b/src/comissions.app.api/Migrations/ApplicationDbContextModelSnapshot.cs @@ -207,6 +207,15 @@ namespace comissions.app.api.Migrations b.Property("RequestDate") .HasColumnType("timestamp with time zone"); + b.Property("Review") + .HasColumnType("text"); + + b.Property("ReviewRating") + .HasColumnType("double precision"); + + b.Property("Reviewed") + .HasColumnType("boolean"); + b.Property("UserId") .IsRequired() .HasColumnType("text"); @@ -279,6 +288,50 @@ namespace comissions.app.api.Migrations b.ToTable("Requests"); }); + modelBuilder.Entity("comissions.app.database.Entities.RequestAsset", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("FileReference") + .IsRequired() + .HasColumnType("text"); + + b.Property("RequestId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("RequestId"); + + b.ToTable("RequestAssets"); + }); + + modelBuilder.Entity("comissions.app.database.Entities.RequestReference", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("FileReference") + .IsRequired() + .HasColumnType("text"); + + b.Property("RequestId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("RequestId"); + + b.ToTable("RequestsReferences"); + }); + modelBuilder.Entity("comissions.app.database.Entities.User", b => { b.Property("Id") @@ -445,7 +498,7 @@ namespace comissions.app.api.Migrations modelBuilder.Entity("comissions.app.database.Entities.Request", b => { b.HasOne("comissions.app.database.Entities.UserArtist", "Artist") - .WithMany() + .WithMany("Requests") .HasForeignKey("ArtistId") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); @@ -461,6 +514,28 @@ namespace comissions.app.api.Migrations b.Navigation("User"); }); + modelBuilder.Entity("comissions.app.database.Entities.RequestAsset", b => + { + b.HasOne("comissions.app.database.Entities.Request", "Request") + .WithMany("RequestAssets") + .HasForeignKey("RequestId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Request"); + }); + + modelBuilder.Entity("comissions.app.database.Entities.RequestReference", b => + { + b.HasOne("comissions.app.database.Entities.Request", "Request") + .WithMany("RequestReferences") + .HasForeignKey("RequestId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Request"); + }); + modelBuilder.Entity("comissions.app.database.Entities.UserArtist", b => { b.HasOne("comissions.app.database.Entities.User", "User") @@ -472,6 +547,13 @@ namespace comissions.app.api.Migrations b.Navigation("User"); }); + modelBuilder.Entity("comissions.app.database.Entities.Request", b => + { + b.Navigation("RequestAssets"); + + b.Navigation("RequestReferences"); + }); + modelBuilder.Entity("comissions.app.database.Entities.User", b => { b.Navigation("UserArtist"); @@ -483,6 +565,8 @@ namespace comissions.app.api.Migrations .IsRequired(); b.Navigation("PortfolioPieces"); + + b.Navigation("Requests"); }); #pragma warning restore 612, 618 } diff --git a/src/comissions.app.api/Models/Request/RequestImageModel.cs b/src/comissions.app.api/Models/Request/RequestImageModel.cs new file mode 100644 index 0000000..58454be --- /dev/null +++ b/src/comissions.app.api/Models/Request/RequestImageModel.cs @@ -0,0 +1,7 @@ +namespace comissions.app.database.Models.Request; + +public class RequestImageModel +{ + public int Id { get; set; } + public string FileReference { get; set; } +} \ No newline at end of file diff --git a/src/comissions.app.api/Models/Request/RequestModelExtensions.cs b/src/comissions.app.api/Models/Request/RequestModelExtensions.cs index c22546b..d75f839 100644 --- a/src/comissions.app.api/Models/Request/RequestModelExtensions.cs +++ b/src/comissions.app.api/Models/Request/RequestModelExtensions.cs @@ -2,6 +2,22 @@ namespace comissions.app.database.Models.Request; public static class RequestModelExtensions { + public static RequestImageModel ToModel(this Entities.RequestAsset requestAsset) + { + return new RequestImageModel() + { + Id = requestAsset.Id, + FileReference = requestAsset.FileReference + }; + } + public static RequestImageModel ToModel(this Entities.RequestReference requestAsset) + { + return new RequestImageModel() + { + Id = requestAsset.Id, + FileReference = requestAsset.FileReference + }; + } public static RequestModel ToModel(this Entities.Request sellerProfile) { return new RequestModel()