From f9704fcb9831083750f070d8c47b8158dee8839b Mon Sep 17 00:00:00 2001 From: Raffaello Damgaard Date: Mon, 12 Jun 2023 11:00:31 -0300 Subject: [PATCH 1/2] Ajustes no mail sender. --- .../Jobs/5 - NewBookGetInterestedUsers.cs | 10 +++++++++- ShareBook/Sharebook.Jobs/Jobs/7 - MailSender.cs | 4 +--- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/ShareBook/Sharebook.Jobs/Jobs/5 - NewBookGetInterestedUsers.cs b/ShareBook/Sharebook.Jobs/Jobs/5 - NewBookGetInterestedUsers.cs index fa88201b..b62e8029 100644 --- a/ShareBook/Sharebook.Jobs/Jobs/5 - NewBookGetInterestedUsers.cs +++ b/ShareBook/Sharebook.Jobs/Jobs/5 - NewBookGetInterestedUsers.cs @@ -105,8 +105,16 @@ public override JobHistory Work() private int GetEmailMaxDestinationsPerQueueMessage() { + // O MailSender é invocado 10x a cada hora. + var mailSenderInvocationsPerHour = 10; + + // Queremos que o MailSender processe 3 mensagens sqs pra fazer seu trabalho + var totalSqsMessagensPerWork = 3; + var maxEmailsPerHour = int.Parse(_configuration["EmailSettings:MaxEmailsPerHour"]); - return maxEmailsPerHour / 12; + return (maxEmailsPerHour / mailSenderInvocationsPerHour) / totalSqsMessagensPerWork; + + // } private string GetEmailTemplate(Guid bookId){ diff --git a/ShareBook/Sharebook.Jobs/Jobs/7 - MailSender.cs b/ShareBook/Sharebook.Jobs/Jobs/7 - MailSender.cs index 8e8626ef..2d1cad08 100644 --- a/ShareBook/Sharebook.Jobs/Jobs/7 - MailSender.cs +++ b/ShareBook/Sharebook.Jobs/Jobs/7 - MailSender.cs @@ -85,7 +85,6 @@ private int SendEmail(SharebookMessage sqsMessage) var emails = destinations.Select(x => x.Email).ToList(); var bounces = _emailService.GetBounces(emails).Result; - var totalBounces = 0; foreach (var destination in destinations) { @@ -93,7 +92,6 @@ private int SendEmail(SharebookMessage sqsMessage) if (_emailService.IsBounce(destination.Email, bounces)) { _log.Add($"Não enviei email para {destination.Email} porque está em estado de BOUNCE."); - totalBounces++; continue; } @@ -112,7 +110,7 @@ private int SendEmail(SharebookMessage sqsMessage) Thread.Sleep(100); } - return destinations.Count - totalBounces; + return destinations.Count; } private static string GetFirstName(string fullName) From d8e0322a87a44d8744d66012f879a036290593e8 Mon Sep 17 00:00:00 2001 From: Raffaello Damgaard Date: Wed, 26 Jul 2023 17:54:20 -0300 Subject: [PATCH 2/2] Novo campo meetup active. --- .../Controllers/MeetupController.cs | 2 +- ShareBook/ShareBook.Domain/Meetup.cs | 1 + .../20230726204851_meetupActive.Designer.cs | 581 ++++++++++++++++++ .../Migrations/20230726204851_meetupActive.cs | 26 + .../ApplicationDbContextModelSnapshot.cs | 3 + .../ShareBook.Service/Meetup/MeetupService.cs | 2 +- 6 files changed, 613 insertions(+), 2 deletions(-) create mode 100644 ShareBook/ShareBook.Repository/Migrations/20230726204851_meetupActive.Designer.cs create mode 100644 ShareBook/ShareBook.Repository/Migrations/20230726204851_meetupActive.cs diff --git a/ShareBook/ShareBook.Api/Controllers/MeetupController.cs b/ShareBook/ShareBook.Api/Controllers/MeetupController.cs index b6dc0683..7f96e458 100644 --- a/ShareBook/ShareBook.Api/Controllers/MeetupController.cs +++ b/ShareBook/ShareBook.Api/Controllers/MeetupController.cs @@ -22,7 +22,7 @@ public MeetupController(IMeetupService meetupService) public PagedList Get(int? page, int? pageSize, bool upcoming = false) { - return _meetupService.Get(upcoming ? x => x.StartDate > DateTime.Now : x => x.StartDate <= DateTime.Now, x => x.StartDate, page ?? 1, pageSize ?? 10); + return _meetupService.Get(upcoming ? x => x.Active && x.StartDate > DateTime.Now : x => x.Active && x.StartDate <= DateTime.Now, x => x.StartDate, page ?? 1, pageSize ?? 10); } [HttpGet("{id}")] diff --git a/ShareBook/ShareBook.Domain/Meetup.cs b/ShareBook/ShareBook.Domain/Meetup.cs index c70158e0..6aa2c45d 100644 --- a/ShareBook/ShareBook.Domain/Meetup.cs +++ b/ShareBook/ShareBook.Domain/Meetup.cs @@ -19,5 +19,6 @@ public class Meetup : BaseEntity public string SymplaEventUrl { get; set; } public ICollection MeetupParticipants { get; set; } public bool IsParticipantListSynced { get; set; } = false; + public bool Active { get; set; } = true; } } \ No newline at end of file diff --git a/ShareBook/ShareBook.Repository/Migrations/20230726204851_meetupActive.Designer.cs b/ShareBook/ShareBook.Repository/Migrations/20230726204851_meetupActive.Designer.cs new file mode 100644 index 00000000..71e45643 --- /dev/null +++ b/ShareBook/ShareBook.Repository/Migrations/20230726204851_meetupActive.Designer.cs @@ -0,0 +1,581 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using ShareBook.Repository; + +#nullable disable + +namespace ShareBook.Repository.Migrations +{ + [DbContext(typeof(ApplicationDbContext))] + [Migration("20230726204851_meetupActive")] + partial class meetupActive + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "6.0.1") + .HasAnnotation("Relational:MaxIdentifierLength", 128); + + SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder, 1L, 1); + + modelBuilder.Entity("ShareBook.Domain.AccessHistory", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("CreationDate") + .HasColumnType("datetime2"); + + b.Property("Profile") + .HasColumnType("int"); + + b.Property("UserId") + .HasColumnType("uniqueidentifier"); + + b.Property("VisitorName") + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("AccessHistories", (string)null); + }); + + modelBuilder.Entity("ShareBook.Domain.Address", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("City") + .HasMaxLength(30) + .HasColumnType("varchar(30)"); + + b.Property("Complement") + .HasMaxLength(30) + .HasColumnType("varchar(30)"); + + b.Property("Country") + .HasMaxLength(30) + .HasColumnType("varchar(30)"); + + b.Property("CreationDate") + .HasColumnType("datetime2"); + + b.Property("Neighborhood") + .HasMaxLength(30) + .HasColumnType("varchar(30)"); + + b.Property("Number") + .HasMaxLength(10) + .HasColumnType("varchar(10)"); + + b.Property("PostalCode") + .HasMaxLength(15) + .HasColumnType("varchar(15)"); + + b.Property("State") + .HasMaxLength(30) + .HasColumnType("varchar(30)"); + + b.Property("Street") + .HasMaxLength(50) + .HasColumnType("varchar(50)"); + + b.Property("UserId") + .HasColumnType("uniqueidentifier"); + + b.HasKey("Id"); + + b.HasIndex("UserId") + .IsUnique(); + + b.ToTable("Addresses"); + }); + + modelBuilder.Entity("ShareBook.Domain.Book", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("Author") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("varchar(50)"); + + b.Property("CategoryId") + .HasColumnType("uniqueidentifier"); + + b.Property("ChooseDate") + .HasColumnType("datetime2"); + + b.Property("CreationDate") + .HasColumnType("datetime2"); + + b.Property("EBookDownloadLink") + .HasColumnType("nvarchar(max)"); + + b.Property("EBookPdfFile") + .HasColumnType("nvarchar(max)"); + + b.Property("FacilitatorNotes") + .HasMaxLength(2000) + .HasColumnType("varchar(2000)"); + + b.Property("FreightOption") + .HasColumnType("int"); + + b.Property("ImageSlug") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("varchar(100)"); + + b.Property("Slug") + .HasMaxLength(100) + .HasColumnType("varchar(100)"); + + b.Property("Status") + .HasColumnType("int"); + + b.Property("Synopsis") + .HasMaxLength(2000) + .HasColumnType("varchar(2000)"); + + b.Property("Title") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("varchar(50)"); + + b.Property("TrackingNumber") + .HasColumnType("nvarchar(max)"); + + b.Property("Type") + .HasColumnType("int"); + + b.Property("UserId") + .HasColumnType("uniqueidentifier"); + + b.Property("UserIdFacilitator") + .HasColumnType("uniqueidentifier"); + + b.HasKey("Id"); + + b.HasIndex("CategoryId"); + + b.HasIndex("UserId"); + + b.HasIndex("UserIdFacilitator"); + + b.ToTable("Books"); + }); + + modelBuilder.Entity("ShareBook.Domain.BookUser", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("BookId") + .HasColumnType("uniqueidentifier"); + + b.Property("UserId") + .HasColumnType("uniqueidentifier"); + + b.Property("CreationDate") + .HasColumnType("datetime2"); + + b.Property("NickName") + .HasMaxLength(64) + .HasColumnType("varchar(64)"); + + b.Property("Note") + .HasMaxLength(2000) + .HasColumnType("varchar(2000)"); + + b.Property("Reason") + .HasMaxLength(2000) + .HasColumnType("varchar(2000)"); + + b.Property("Status") + .HasColumnType("int"); + + b.HasKey("Id", "BookId", "UserId"); + + b.HasIndex("BookId"); + + b.HasIndex("UserId"); + + b.ToTable("BookUser"); + }); + + modelBuilder.Entity("ShareBook.Domain.Category", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("CreationDate") + .HasColumnType("datetime2"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("varchar(100)"); + + b.HasKey("Id"); + + b.ToTable("Categories"); + }); + + modelBuilder.Entity("ShareBook.Domain.JobHistory", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("CreationDate") + .HasColumnType("datetime2"); + + b.Property("Details") + .HasColumnType("varchar(max)"); + + b.Property("IsSuccess") + .HasColumnType("bit"); + + b.Property("JobName") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("varchar(200)"); + + b.Property("LastResult") + .HasMaxLength(200) + .HasColumnType("varchar(200)"); + + b.Property("TimeSpentSeconds") + .HasColumnType("float"); + + b.HasKey("Id"); + + b.ToTable("JobHistories"); + }); + + modelBuilder.Entity("ShareBook.Domain.LogEntry", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("CreationDate") + .HasColumnType("datetime2"); + + b.Property("EntityId") + .HasColumnType("uniqueidentifier"); + + b.Property("EntityName") + .HasColumnType("varchar(64)"); + + b.Property("LogDateTime") + .HasColumnType("datetime2"); + + b.Property("Operation") + .HasColumnType("nvarchar(max)"); + + b.Property("UserId") + .HasColumnType("uniqueidentifier"); + + b.Property("ValuesChanges") + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.HasIndex("EntityName", "EntityId"); + + b.ToTable("LogEntries"); + }); + + modelBuilder.Entity("ShareBook.Domain.MailBounce", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("Body") + .HasColumnType("nvarchar(max)"); + + b.Property("CreationDate") + .HasColumnType("datetime2"); + + b.Property("Email") + .HasColumnType("nvarchar(450)"); + + b.Property("ErrorCode") + .HasColumnType("nvarchar(max)"); + + b.Property("IsBounce") + .HasColumnType("bit"); + + b.Property("IsSoft") + .HasColumnType("bit"); + + b.Property("Subject") + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.HasIndex("Email"); + + b.ToTable("MailBounces"); + }); + + modelBuilder.Entity("ShareBook.Domain.Meetup", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("Active") + .HasColumnType("bit"); + + b.Property("Cover") + .HasColumnType("nvarchar(max)"); + + b.Property("CreationDate") + .HasColumnType("datetime2"); + + b.Property("Description") + .HasColumnType("nvarchar(max)"); + + b.Property("IsParticipantListSynced") + .HasColumnType("bit"); + + b.Property("StartDate") + .HasColumnType("datetime2"); + + b.Property("SymplaEventId") + .HasColumnType("int"); + + b.Property("SymplaEventUrl") + .HasColumnType("nvarchar(max)"); + + b.Property("Title") + .HasColumnType("nvarchar(max)"); + + b.Property("YoutubeUrl") + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.ToTable("Meetups"); + }); + + modelBuilder.Entity("ShareBook.Domain.MeetupParticipant", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("CreationDate") + .HasColumnType("datetime2"); + + b.Property("Email") + .HasColumnType("nvarchar(max)"); + + b.Property("FirstName") + .HasColumnType("nvarchar(max)"); + + b.Property("LastName") + .HasColumnType("nvarchar(max)"); + + b.Property("MeetupId") + .HasColumnType("uniqueidentifier"); + + b.HasKey("Id"); + + b.HasIndex("MeetupId"); + + b.ToTable("MeetupParticipants"); + }); + + modelBuilder.Entity("ShareBook.Domain.User", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier"); + + b.Property("Active") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValueSql("1"); + + b.Property("AllowSendingEmail") + .HasColumnType("bit") + .HasDefaultValue(true); + + b.Property("CreationDate") + .HasColumnType("datetime2"); + + b.Property("Email") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("varchar(100)"); + + b.Property("HashCodePassword") + .HasMaxLength(200) + .HasColumnType("varchar(200)"); + + b.Property("HashCodePasswordExpiryDate") + .HasColumnType("datetime2(7)"); + + b.Property("Instagram") + .HasColumnType("nvarchar(max)"); + + b.Property("LastLogin") + .ValueGeneratedOnAdd() + .HasColumnType("datetime2") + .HasDefaultValueSql("getdate()"); + + b.Property("Linkedin") + .HasMaxLength(100) + .HasColumnType("varchar(100)"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("varchar(100)"); + + b.Property("ParentAproved") + .HasColumnType("bit"); + + b.Property("ParentEmail") + .HasColumnType("nvarchar(max)"); + + b.Property("ParentHashCodeAproval") + .HasColumnType("nvarchar(max)"); + + b.Property("Password") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("varchar(50)"); + + b.Property("PasswordSalt") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("varchar(50)"); + + b.Property("Phone") + .HasMaxLength(30) + .HasColumnType("varchar(30)"); + + b.Property("Profile") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("Email") + .IsUnique(); + + b.ToTable("Users"); + }); + + modelBuilder.Entity("ShareBook.Domain.AccessHistory", b => + { + b.HasOne("ShareBook.Domain.User", "User") + .WithMany("Visitors") + .HasForeignKey("UserId"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("ShareBook.Domain.Address", b => + { + b.HasOne("ShareBook.Domain.User", null) + .WithOne("Address") + .HasForeignKey("ShareBook.Domain.Address", "UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("ShareBook.Domain.Book", b => + { + b.HasOne("ShareBook.Domain.Category", "Category") + .WithMany() + .HasForeignKey("CategoryId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("ShareBook.Domain.User", "User") + .WithMany("BooksDonated") + .HasForeignKey("UserId"); + + b.HasOne("ShareBook.Domain.User", "UserFacilitator") + .WithMany() + .HasForeignKey("UserIdFacilitator"); + + b.Navigation("Category"); + + b.Navigation("User"); + + b.Navigation("UserFacilitator"); + }); + + modelBuilder.Entity("ShareBook.Domain.BookUser", b => + { + b.HasOne("ShareBook.Domain.Book", "Book") + .WithMany("BookUsers") + .HasForeignKey("BookId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("ShareBook.Domain.User", "User") + .WithMany("BookUsers") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Book"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("ShareBook.Domain.MeetupParticipant", b => + { + b.HasOne("ShareBook.Domain.Meetup", "Meetup") + .WithMany("MeetupParticipants") + .HasForeignKey("MeetupId"); + + b.Navigation("Meetup"); + }); + + modelBuilder.Entity("ShareBook.Domain.Book", b => + { + b.Navigation("BookUsers"); + }); + + modelBuilder.Entity("ShareBook.Domain.Meetup", b => + { + b.Navigation("MeetupParticipants"); + }); + + modelBuilder.Entity("ShareBook.Domain.User", b => + { + b.Navigation("Address"); + + b.Navigation("BookUsers"); + + b.Navigation("BooksDonated"); + + b.Navigation("Visitors"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/ShareBook/ShareBook.Repository/Migrations/20230726204851_meetupActive.cs b/ShareBook/ShareBook.Repository/Migrations/20230726204851_meetupActive.cs new file mode 100644 index 00000000..eaa203c7 --- /dev/null +++ b/ShareBook/ShareBook.Repository/Migrations/20230726204851_meetupActive.cs @@ -0,0 +1,26 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace ShareBook.Repository.Migrations +{ + public partial class meetupActive : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AddColumn( + name: "Active", + table: "Meetups", + type: "bit", + nullable: false, + defaultValue: false); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "Active", + table: "Meetups"); + } + } +} diff --git a/ShareBook/ShareBook.Repository/Migrations/ApplicationDbContextModelSnapshot.cs b/ShareBook/ShareBook.Repository/Migrations/ApplicationDbContextModelSnapshot.cs index 123b9f73..2f5cb00d 100644 --- a/ShareBook/ShareBook.Repository/Migrations/ApplicationDbContextModelSnapshot.cs +++ b/ShareBook/ShareBook.Repository/Migrations/ApplicationDbContextModelSnapshot.cs @@ -340,6 +340,9 @@ protected override void BuildModel(ModelBuilder modelBuilder) .ValueGeneratedOnAdd() .HasColumnType("uniqueidentifier"); + b.Property("Active") + .HasColumnType("bit"); + b.Property("Cover") .HasColumnType("nvarchar(max)"); diff --git a/ShareBook/ShareBook.Service/Meetup/MeetupService.cs b/ShareBook/ShareBook.Service/Meetup/MeetupService.cs index 7f6e9ee0..8432282e 100644 --- a/ShareBook/ShareBook.Service/Meetup/MeetupService.cs +++ b/ShareBook/ShareBook.Service/Meetup/MeetupService.cs @@ -216,7 +216,7 @@ private async Task UploadCover(string coverUrl, string eventName) public IList Search(string criteria) { return _repository.Get() - .Where(m => m.Title.ToUpper().Contains(criteria.ToUpper()) || m.Description.ToUpper().Contains(criteria.ToUpper())) + .Where(m => m.Active && ( m.Title.ToUpper().Contains(criteria.ToUpper()) || m.Description.ToUpper().Contains(criteria.ToUpper()))) .OrderByDescending(m => m.CreationDate) .ToList(); }