diff --git a/src/comissions.app.api/ApplicationDbContext.cs b/src/comissions.app.api/ApplicationDbContext.cs index 187bb19..ea1495b 100644 --- a/src/comissions.app.api/ApplicationDbContext.cs +++ b/src/comissions.app.api/ApplicationDbContext.cs @@ -48,5 +48,6 @@ public class ApplicationDbContext:DbContext public DbSet Requests { get; set; }= null!; public DbSet RequestReferences { get; set; }= null!; public DbSet RequestAssets { get; set; }= null!; + public DbSet ArtistRequestMessages { get; set; }= null!; #endregion } \ No newline at end of file diff --git a/src/comissions.app.api/Controllers/ArtistAccessRequestController.cs b/src/comissions.app.api/Controllers/ArtistAccessRequestController.cs new file mode 100644 index 0000000..81cc887 --- /dev/null +++ b/src/comissions.app.api/Controllers/ArtistAccessRequestController.cs @@ -0,0 +1,128 @@ +using comissions.app.api.Extensions; +using comissions.app.api.Models.PortfolioModel; +using comissions.app.api.Models.Artist; +using comissions.app.api.Models.ArtistRequest; +using comissions.app.api.Services.Payment; +using comissions.app.api.Services.Storage; +using comissions.app.database; +using comissions.app.database.Entities; +using comissions.app.database.Models; +using comissions.app.database.Models.Request; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using Microsoft.EntityFrameworkCore; +using Newtonsoft.Json; +using Novu; +using Novu.DTO.Events; + +namespace comissions.app.api.Controllers; + +[ApiController] +[Route("api/[controller]")] +public class ArtistAccessRequestController : Controller +{ + private readonly ApplicationDbContext _dbContext; + private readonly IStorageService _storageService; + private readonly IPaymentService _paymentService; + private readonly NovuClient _client; + + public ArtistAccessRequestController(ApplicationDbContext dbContext, IPaymentService paymentService, IStorageService storageService, NovuClient client) + { + _client = client; + _paymentService = paymentService; + _storageService = storageService; + _dbContext = dbContext; + } + + [HttpPost] + [Authorize("write:artist")] + public async Task RequestArtist([FromBody] string message) + { + var userId = User.GetUserId(); + + var existingArtist = await _dbContext.UserArtists.FirstOrDefaultAsync(Artist=>Artist.UserId==userId); + if (existingArtist != null) + { + return Unauthorized(); + } + + var artistRequest = await _dbContext.ArtistRequests.FirstOrDefaultAsync(request=>request.UserId==userId); + if (artistRequest != null) + return Ok(artistRequest.ToModel()); + + artistRequest = new ArtistRequest() + { + Accepted = false, + Message = message, + RequestDate = DateTime.UtcNow, + UserId = userId + }; + + _dbContext.ArtistRequests.Add(artistRequest); + await _dbContext.SaveChangesAsync(); + return Ok(artistRequest.ToModel()); + } + + [HttpGet] + [Authorize("read:artist")] + public async Task GetRequest() + { + var userId = User.GetUserId(); + var existingArtist = await _dbContext.UserArtists.FirstOrDefaultAsync(Artist=>Artist.UserId==userId); + if (existingArtist != null) + { + return Unauthorized(); + } + + var artistRequest = await _dbContext.ArtistRequests.FirstOrDefaultAsync(request=>request.UserId==userId); + if (artistRequest == null) + return NotFound(); + + return Ok(artistRequest.ToModel()); + } + + [HttpPost] + [Authorize("write:artist")] + [Route("Messages")] + public async Task AddMessage([FromBody] string message) + { + var userId = User.GetUserId(); + var existingArtist = await _dbContext.UserArtists.FirstOrDefaultAsync(Artist=>Artist.UserId==userId); + if (existingArtist != null) + { + return Unauthorized(); + } + + var artistRequest = await _dbContext.ArtistRequests.FirstOrDefaultAsync(request=>request.UserId==userId); + if (artistRequest == null) + return NotFound(); + + var newMessage = new ArtistRequestMessage() + { + UserId = userId, + Message = message, + SentDate = DateTime.UtcNow + }; + artistRequest.ArtistRequestMessages.Add(newMessage); + await _dbContext.SaveChangesAsync(); + return Ok(artistRequest.ToModel()); + } + + [HttpGet] + [Authorize("read:artist")] + [Route("Messages")] + public async Task GetMessages() + { + var userId = User.GetUserId(); + var existingArtist = await _dbContext.UserArtists.FirstOrDefaultAsync(Artist=>Artist.UserId==userId); + if (existingArtist != null) + { + return Unauthorized(); + } + var artistRequest = await _dbContext.ArtistRequests.FirstOrDefaultAsync(request=>request.UserId==userId); + if (artistRequest == null) + return NotFound(); + var result = artistRequest.ArtistRequestMessages.Select(x => x.ToModel()).ToList(); + return Ok(result); + } +} \ No newline at end of file diff --git a/src/comissions.app.api/Controllers/ArtistController.cs b/src/comissions.app.api/Controllers/ArtistController.cs index 979b11c..c78d076 100644 --- a/src/comissions.app.api/Controllers/ArtistController.cs +++ b/src/comissions.app.api/Controllers/ArtistController.cs @@ -117,36 +117,5 @@ public class ArtistController : Controller return NotFound(); var result = ArtistRequest.ToModel(); return Ok(result); - } - - - [HttpPost] - [Authorize("write:artist")] - public async Task RequestArtist([FromBody] string message) - { - var userId = User.GetUserId(); - - var existingArtist = await _dbContext.UserArtists.FirstOrDefaultAsync(Artist=>Artist.UserId==userId); - if (existingArtist != null) - { - return Unauthorized(); - } - - var ArtistRequest = await _dbContext.ArtistRequests.FirstOrDefaultAsync(request=>request.UserId==userId); - if (ArtistRequest != null) - return Ok(ArtistRequest.ToModel()); - - ArtistRequest = new ArtistRequest() - { - Accepted = false, - Message = message, - RequestDate = DateTime.UtcNow, - UserId = userId - }; - - _dbContext.ArtistRequests.Add(ArtistRequest); - await _dbContext.SaveChangesAsync(); - return Ok(); - } - + } } \ No newline at end of file diff --git a/src/comissions.app.api/Entities/ArtistRequest.cs b/src/comissions.app.api/Entities/ArtistRequest.cs index 60fe60a..9e2c86f 100644 --- a/src/comissions.app.api/Entities/ArtistRequest.cs +++ b/src/comissions.app.api/Entities/ArtistRequest.cs @@ -8,9 +8,7 @@ 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!; + public virtual ICollection ArtistRequestMessages { get; set; } = null!; } \ No newline at end of file diff --git a/src/comissions.app.api/Entities/ArtistRequestMessage.cs b/src/comissions.app.api/Entities/ArtistRequestMessage.cs new file mode 100644 index 0000000..ae2af43 --- /dev/null +++ b/src/comissions.app.api/Entities/ArtistRequestMessage.cs @@ -0,0 +1,10 @@ +namespace comissions.app.database.Entities; + +public class ArtistRequestMessage +{ + public int Id { get; set; } + public string Message { get; set; } + public DateTime SentDate { get; set; } + public string UserId { get; set; } + public virtual User User { get; set; } +} \ No newline at end of file diff --git a/src/comissions.app.api/Migrations/20240310021457_fix.Designer.cs b/src/comissions.app.api/Migrations/20240310021457_fix.Designer.cs new file mode 100644 index 0000000..fba1c3b --- /dev/null +++ b/src/comissions.app.api/Migrations/20240310021457_fix.Designer.cs @@ -0,0 +1,631 @@ +// +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("20240310021457_fix")] + partial class fix + { + /// + 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("UserId") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("ArtistRequests"); + }); + + modelBuilder.Entity("comissions.app.database.Entities.ArtistRequestMessage", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Message") + .IsRequired() + .HasColumnType("text"); + + b.Property("SentDate") + .HasColumnType("timestamp with time zone"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("ArtistRequestMessages"); + }); + + 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("ArtistRequestId") + .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("Rating") + .HasColumnType("double precision"); + + b.Property("RequestDate") + .HasColumnType("timestamp with time zone"); + + b.Property("ReviewDate") + .HasColumnType("timestamp with time zone"); + + b.Property("ReviewMessage") + .HasColumnType("text"); + + b.Property("Reviewed") + .HasColumnType("boolean"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("ArtistId"); + + b.HasIndex("ArtistRequestId"); + + 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("RequestReferences"); + }); + + 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.ArtistRequestMessage", 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.ArtistRequest", null) + .WithMany("Requests") + .HasForeignKey("ArtistRequestId"); + + 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.ArtistRequest", b => + { + b.Navigation("Requests"); + }); + + 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/20240310021457_fix.cs b/src/comissions.app.api/Migrations/20240310021457_fix.cs new file mode 100644 index 0000000..0c65b06 --- /dev/null +++ b/src/comissions.app.api/Migrations/20240310021457_fix.cs @@ -0,0 +1,110 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +#nullable disable + +namespace comissions.app.api.Migrations +{ + /// + public partial class fix : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "Review", + table: "ArtistRequests"); + + migrationBuilder.DropColumn( + name: "ReviewRating", + table: "ArtistRequests"); + + migrationBuilder.DropColumn( + name: "Reviewed", + table: "ArtistRequests"); + + migrationBuilder.AddColumn( + name: "ArtistRequestId", + table: "Requests", + type: "integer", + nullable: true); + + migrationBuilder.CreateTable( + name: "ArtistRequestMessages", + columns: table => new + { + Id = table.Column(type: "integer", nullable: false) + .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), + Message = table.Column(type: "text", nullable: false), + SentDate = table.Column(type: "timestamp with time zone", nullable: false), + UserId = table.Column(type: "text", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_ArtistRequestMessages", x => x.Id); + table.ForeignKey( + name: "FK_ArtistRequestMessages_Users_UserId", + column: x => x.UserId, + principalTable: "Users", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateIndex( + name: "IX_Requests_ArtistRequestId", + table: "Requests", + column: "ArtistRequestId"); + + migrationBuilder.CreateIndex( + name: "IX_ArtistRequestMessages_UserId", + table: "ArtistRequestMessages", + column: "UserId"); + + migrationBuilder.AddForeignKey( + name: "FK_Requests_ArtistRequests_ArtistRequestId", + table: "Requests", + column: "ArtistRequestId", + principalTable: "ArtistRequests", + principalColumn: "Id"); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropForeignKey( + name: "FK_Requests_ArtistRequests_ArtistRequestId", + table: "Requests"); + + migrationBuilder.DropTable( + name: "ArtistRequestMessages"); + + migrationBuilder.DropIndex( + name: "IX_Requests_ArtistRequestId", + table: "Requests"); + + migrationBuilder.DropColumn( + name: "ArtistRequestId", + table: "Requests"); + + 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); + } + } +} diff --git a/src/comissions.app.api/Migrations/ApplicationDbContextModelSnapshot.cs b/src/comissions.app.api/Migrations/ApplicationDbContextModelSnapshot.cs index b0ea402..efd9697 100644 --- a/src/comissions.app.api/Migrations/ApplicationDbContextModelSnapshot.cs +++ b/src/comissions.app.api/Migrations/ApplicationDbContextModelSnapshot.cs @@ -207,15 +207,6 @@ 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"); @@ -227,6 +218,32 @@ namespace comissions.app.api.Migrations b.ToTable("ArtistRequests"); }); + modelBuilder.Entity("comissions.app.database.Entities.ArtistRequestMessage", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Message") + .IsRequired() + .HasColumnType("text"); + + b.Property("SentDate") + .HasColumnType("timestamp with time zone"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("ArtistRequestMessages"); + }); + modelBuilder.Entity("comissions.app.database.Entities.Request", b => { b.Property("Id") @@ -247,6 +264,9 @@ namespace comissions.app.api.Migrations b.Property("ArtistId") .HasColumnType("integer"); + b.Property("ArtistRequestId") + .HasColumnType("integer"); + b.Property("Completed") .HasColumnType("boolean"); @@ -295,6 +315,8 @@ namespace comissions.app.api.Migrations b.HasIndex("ArtistId"); + b.HasIndex("ArtistRequestId"); + b.HasIndex("UserId"); b.ToTable("Requests"); @@ -507,6 +529,17 @@ namespace comissions.app.api.Migrations b.Navigation("User"); }); + modelBuilder.Entity("comissions.app.database.Entities.ArtistRequestMessage", 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") @@ -515,6 +548,10 @@ namespace comissions.app.api.Migrations .OnDelete(DeleteBehavior.Cascade) .IsRequired(); + b.HasOne("comissions.app.database.Entities.ArtistRequest", null) + .WithMany("Requests") + .HasForeignKey("ArtistRequestId"); + b.HasOne("comissions.app.database.Entities.User", "User") .WithMany() .HasForeignKey("UserId") @@ -559,6 +596,11 @@ namespace comissions.app.api.Migrations b.Navigation("User"); }); + modelBuilder.Entity("comissions.app.database.Entities.ArtistRequest", b => + { + b.Navigation("Requests"); + }); + modelBuilder.Entity("comissions.app.database.Entities.Request", b => { b.Navigation("RequestAssets"); diff --git a/src/comissions.app.api/Models/ArtistAccessRequestMessage.cs b/src/comissions.app.api/Models/ArtistAccessRequestMessage.cs new file mode 100644 index 0000000..b2854d2 --- /dev/null +++ b/src/comissions.app.api/Models/ArtistAccessRequestMessage.cs @@ -0,0 +1,22 @@ +using comissions.app.database.Entities; + +namespace comissions.app.database.Models; + +public class ArtistAccessRequestMessage +{ + public string SenderId { get; set; } + public string Message { get; set; } + public DateTime SentDate { get; set; } +} +public static class ArtistAccessRequestMessageExtensions +{ + public static ArtistAccessRequestMessage ToModel(this ArtistRequestMessage message) + { + return new ArtistAccessRequestMessage() + { + SenderId = message.UserId, + Message = message.Message, + SentDate = message.SentDate + }; + } +} \ No newline at end of file diff --git a/src/comissions.app.database.migrator/obj/Debug/net8.0/comissions.app.database.migrator.AssemblyInfo.cs b/src/comissions.app.database.migrator/obj/Debug/net8.0/comissions.app.database.migrator.AssemblyInfo.cs index d3d731c..fe004c6 100644 --- a/src/comissions.app.database.migrator/obj/Debug/net8.0/comissions.app.database.migrator.AssemblyInfo.cs +++ b/src/comissions.app.database.migrator/obj/Debug/net8.0/comissions.app.database.migrator.AssemblyInfo.cs @@ -13,7 +13,7 @@ using System.Reflection; [assembly: System.Reflection.AssemblyCompanyAttribute("comissions.app.database.migrator")] [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] -[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+0587ebd942b3c18ddca3d939fcc3ae7c12df39d6")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+381bc5e8844469bf214194d596b636911956a7d5")] [assembly: System.Reflection.AssemblyProductAttribute("comissions.app.database.migrator")] [assembly: System.Reflection.AssemblyTitleAttribute("comissions.app.database.migrator")] [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] diff --git a/src/comissions.app.database.migrator/obj/Debug/net8.0/comissions.app.database.migrator.AssemblyInfoInputs.cache b/src/comissions.app.database.migrator/obj/Debug/net8.0/comissions.app.database.migrator.AssemblyInfoInputs.cache index bb5e702..4baef71 100644 --- a/src/comissions.app.database.migrator/obj/Debug/net8.0/comissions.app.database.migrator.AssemblyInfoInputs.cache +++ b/src/comissions.app.database.migrator/obj/Debug/net8.0/comissions.app.database.migrator.AssemblyInfoInputs.cache @@ -1 +1 @@ -947b6aba969a37d22fe07007044e3210a1a2697c7448f25d3c0d3a0cb66506ca +69ac50d95c8c1fb669484852338a4006ee3bdd9ffe4fe2b5d2b8c182c02d4f17