From 1dd514aa7f882009ec03c1cfa10c757dd1c09924 Mon Sep 17 00:00:00 2001 From: Nicky Ye Date: Mon, 16 Dec 2024 12:10:58 +0100 Subject: [PATCH 1/3] big ah commit sorry helge :0( --- ...\246rmbillede 2024-12-16 kl. 10.41.24.png" | Bin 0 -> 88124 bytes .../Repositories/AuthorRepository.cs | 6 +- .../Repositories/CheepRepository.cs | 4 +- src/Chirp.Web/Pages/UserTimeline.cshtml | 91 +++++++++--------- src/Chirp.Web/Pages/UserTimeline.cshtml.cs | 63 +++++++----- 5 files changed, 93 insertions(+), 71 deletions(-) create mode 100644 "docs/images/Sk\303\246rmbillede 2024-12-16 kl. 10.41.24.png" diff --git "a/docs/images/Sk\303\246rmbillede 2024-12-16 kl. 10.41.24.png" "b/docs/images/Sk\303\246rmbillede 2024-12-16 kl. 10.41.24.png" new file mode 100644 index 0000000000000000000000000000000000000000..497eaaa70bb35fb5b9e88b1347fdd520fbd00556 GIT binary patch literal 88124 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 a) - .Where(a => a.UserName == authorName); + .Where(a => a.UserName != null && a.UserName.ToLower() == authorName.ToLower()); var result = await query.FirstOrDefaultAsync(); if (result == null) return null; @@ -157,7 +157,7 @@ public async Task AddFollows(string you, string me) var author = _context.Authors.First(a => a.UserName == authorDto.Name); - author.Follows.Add(me); + author.Follows.Add(me.ToLower()); await _context.SaveChangesAsync(); } @@ -175,7 +175,7 @@ public async Task RemoveFollows(string you, string me) var author = _context.Authors.First(a => a.UserName == authordto.Name); - author.Follows.Remove(me); + author.Follows.Remove(me.ToLower()); await _context.SaveChangesAsync(); } diff --git a/src/Chirp.Infrastructure/Repositories/CheepRepository.cs b/src/Chirp.Infrastructure/Repositories/CheepRepository.cs index 10abb16..44ed7d9 100644 --- a/src/Chirp.Infrastructure/Repositories/CheepRepository.cs +++ b/src/Chirp.Infrastructure/Repositories/CheepRepository.cs @@ -162,7 +162,7 @@ public async Task WriteCheep(Cheep cheep) { var cheepsQuery = _context.Cheeps .Include(c => c.Author) - .Where(c => c.Author.UserName != null && (c.Author.UserName == author || (authors != null && authors.Contains(c.Author.UserName)))) + .Where(c => c.Author.UserName != null && (c.Author.UserName == author || (authors != null && authors.Contains(c.Author.UserName.ToLower())))) .OrderByDescending(c => c.TimeStamp) .Skip((page - 1) * 32) .Take(32); @@ -241,7 +241,7 @@ public async Task GetCheepsCountByFollows(string author, List? auth var query = _context.Cheeps .Select(cheep => cheep) .Include(c => c.Author) - .Where(cheep => cheep.Author.UserName == auth); + .Where(cheep => cheep.Author.UserName != null && cheep.Author.UserName.ToLower() == auth); // Execute the query and store the results var result = await query.ToListAsync(); cheeps.AddRange(result); diff --git a/src/Chirp.Web/Pages/UserTimeline.cshtml b/src/Chirp.Web/Pages/UserTimeline.cshtml index b7e46a0..b42c43d 100644 --- a/src/Chirp.Web/Pages/UserTimeline.cshtml +++ b/src/Chirp.Web/Pages/UserTimeline.cshtml @@ -9,16 +9,16 @@ ViewData["Title"] = "Chirp!"; Layout = "Shared/_Layout"; var routeName = HttpContext.GetRouteValue("author")?.ToString(); + if (routeName != null && routeName.Contains('@')) + { + routeName = ChirpService.GetAuthorByEmail(routeName).Result?.Name; + } }
@if (SignInManager.IsSignedIn(User) && routeName != null) { - if (routeName.Contains('@')) - { - routeName = ChirpService.GetAuthorByEmail(routeName).Result?.Name; - } - if (routeName != null && routeName.Equals(User.Identity?.Name)) + if (routeName.Equals(User.Identity?.Name)) {
@if (User.Identity != null) @@ -46,7 +46,7 @@ @if(User.Identity?.Name != null && !User.Identity.Name.Equals(routeName)) { var user = ChirpService.GetAuthorByName(User.Identity.Name).Result; - var follows = user?.Follows != null && routeName != null && user.Follows.Contains(routeName); + var follows = user?.Follows != null && routeName != null && user.Follows.Contains(routeName.ToLower()); @@ -81,10 +81,10 @@ else {
- @if (routeName != null) - { - @(_ = Model.FetchCheeps(routeName)) - } + @* @if (routeName != null) *@ + @* { *@ + @* @(_ = Model.FetchCheeps(routeName)) *@ + @* } *@
    @@ -106,9 +106,13 @@ else {
    - @if (routeName != null) + @* @if (routeName != null) *@ + @* { *@ + @* @(_ = Model.FetchCheeps(routeName)) *@ + @* } *@ + @if (routeName != null && routeName.Contains('@')) { - @(_ = Model.FetchCheeps(routeName)) + routeName = ChirpService.GetAuthorByEmail(routeName).Result?.Name; }
    @@ -128,37 +132,38 @@
} } - else if(Model.Cheeps==null) - { - You can't cheep that! Cheep is empty! - -
- @if (routeName != null) - { - @(_ = Model.FetchCheeps(routeName)) - } - -
- { -
- } - }else{ + @* else if(Model.Cheeps==null) *@ + @* { *@ + @* You can't cheep that! Cheep is empty! *@ + @* *@ + @*
*@ + @* @if (routeName != null) *@ + @* { *@ + @* @(_ = Model.FetchCheeps(routeName)) *@ + @* } *@ + @* *@ + @*
*@ + @* { *@ + @*
    *@ + @* @if (Model.Cheeps != null) *@ + @* { *@ + @* foreach (var cheep in Model.Cheeps) *@ + @* { *@ + @*
  • *@ + @*

    *@ + @* *@ + @* @cheep.Author *@ + @* *@ + @* @cheep.Text *@ + @* — @cheep.TimeStamp *@ + @*

    *@ + @*
  • *@ + @* } *@ + @* } *@ + @*
*@ + @* } *@ + @* } *@ + else{ There are no cheeps so far. } diff --git a/src/Chirp.Web/Pages/UserTimeline.cshtml.cs b/src/Chirp.Web/Pages/UserTimeline.cshtml.cs index dacb9d3..a2c50b9 100644 --- a/src/Chirp.Web/Pages/UserTimeline.cshtml.cs +++ b/src/Chirp.Web/Pages/UserTimeline.cshtml.cs @@ -92,18 +92,18 @@ public async Task OnGet(string author) await TaskHandlerAsync(author); } - var tmpAuthor = await _chirpService.GetAuthorByName(author); - if (User.Identity != null && User.Identity.Name == author) - { - Cheeps = await _chirpService.GetCheepsFollowedByAuthor(CurrentPage, author, tmpAuthor?.Follows); - Count = await _chirpService.GetCheepsCountByFollows(author, tmpAuthor?.Follows); - return Page(); - } - - Cheeps = await _chirpService.GetPaginatedResultByAuthor(CurrentPage, author, PageSize); - var cheepDtos = _chirpService.GetCheepsByAuthor(author).Result; - if (cheepDtos != null) - Count = cheepDtos.Count; + // var tmpAuthor = await _chirpService.GetAuthorByName(author); + // if (User.Identity != null && User.Identity.Name == author) + // { + // Cheeps = await _chirpService.GetCheepsFollowedByAuthor(CurrentPage, author, tmpAuthor?.Follows); + // Count = await _chirpService.GetCheepsCountByFollows(author, tmpAuthor?.Follows); + // return Page(); + // } + // + // Cheeps = await _chirpService.GetPaginatedResultByAuthor(CurrentPage, author, PageSize); + // var cheepDtos = _chirpService.GetCheepsByAuthor(author).Result; + // if (cheepDtos != null) + // Count = cheepDtos.Count; return Page(); } @@ -122,6 +122,7 @@ public async Task TaskHandlerAsync(string author) if (author.Contains('@')) { await SearchByEmail(author); + return; } await SearchByName(author); @@ -134,20 +135,29 @@ public async Task TaskHandlerAsync(string author) private async Task SearchByEmail(string author) { AuthorDto? createdAuthor = await _chirpService.GetAuthorByEmail(author); - + if (createdAuthor == null) { ModelState.AddModelError(string.Empty, "Author not found"); return; } - - Cheeps = await _chirpService.ReadByAuthor(CurrentPage, createdAuthor.Name); - - if (User.Identity?.Name == createdAuthor.Name) - { + + // if (createdAuthor.Follows.IsNullOrEmpty()) + // { + // Cheeps = await _chirpService.ReadByAuthor(CurrentPage, createdAuthor.Name); + // return; + // } + + if (User.Identity != null && User.Identity.Name == createdAuthor.Name) + { Cheeps = await _chirpService.GetCheepsFollowedByAuthor(CurrentPage, createdAuthor.Name, createdAuthor.Follows); Count = await _chirpService.GetCheepsCountByFollows(author, createdAuthor.Follows); } + else + { + Cheeps = await _chirpService.ReadByAuthor(CurrentPage, createdAuthor.Name); + if (Cheeps != null) Count = Cheeps.Count; + } } /// @@ -164,17 +174,24 @@ private async Task SearchByName(string author) return; } - if (createdAuthor.Follows.IsNullOrEmpty()) - { - Cheeps = await _chirpService.ReadByAuthor(CurrentPage, createdAuthor.Name); - return; - } + // if (createdAuthor.Follows.IsNullOrEmpty()) + // { + // Cheeps = await _chirpService.ReadByAuthor(CurrentPage, createdAuthor.Name); + // return; + // } if (User.Identity != null && User.Identity.Name == createdAuthor.Name) { Cheeps = await _chirpService.GetCheepsFollowedByAuthor(CurrentPage, createdAuthor.Name, createdAuthor.Follows); Count = await _chirpService.GetCheepsCountByFollows(author, createdAuthor.Follows); } + else + { + Cheeps = await _chirpService.ReadByAuthor(CurrentPage, createdAuthor.Name); + var cheepDtos = _chirpService.ReadAllCheeps(createdAuthor.Name).Result; + if (cheepDtos != null) + Count = cheepDtos.Count(); + } } /// From f2cf8a692a6b264f930e1a9cc66010193acc254a Mon Sep 17 00:00:00 2001 From: Nicky Ye Date: Mon, 16 Dec 2024 13:11:28 +0100 Subject: [PATCH 2/3] change author following list to contains lowercase authors --- .../Chirp.Infrastructure.csproj | 1 - .../20241126201925_AppDbContext.Designer.cs | 323 ------------------ .../Migrations/20241126201925_AppDbContext.cs | 254 -------------- .../ApplicationDbContextModelSnapshot.cs | 320 ----------------- .../Repositories/AuthorRepository.cs | 2 +- src/Chirp.Web/Pages/Public.cshtml | 2 +- src/Chirp.Web/Pages/UserTimeline.cshtml | 54 +-- src/Chirp.Web/Pages/UserTimeline.cshtml.cs | 26 +- 8 files changed, 28 insertions(+), 954 deletions(-) delete mode 100644 src/Chirp.Infrastructure/Migrations/20241126201925_AppDbContext.Designer.cs delete mode 100644 src/Chirp.Infrastructure/Migrations/20241126201925_AppDbContext.cs delete mode 100644 src/Chirp.Infrastructure/Migrations/ApplicationDbContextModelSnapshot.cs diff --git a/src/Chirp.Infrastructure/Chirp.Infrastructure.csproj b/src/Chirp.Infrastructure/Chirp.Infrastructure.csproj index cc3a709..6ca25fc 100644 --- a/src/Chirp.Infrastructure/Chirp.Infrastructure.csproj +++ b/src/Chirp.Infrastructure/Chirp.Infrastructure.csproj @@ -13,7 +13,6 @@ - diff --git a/src/Chirp.Infrastructure/Migrations/20241126201925_AppDbContext.Designer.cs b/src/Chirp.Infrastructure/Migrations/20241126201925_AppDbContext.Designer.cs deleted file mode 100644 index 2646115..0000000 --- a/src/Chirp.Infrastructure/Migrations/20241126201925_AppDbContext.Designer.cs +++ /dev/null @@ -1,323 +0,0 @@ -// -using System; -using Chirp.Infrastructure.Data; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; - -#nullable disable - -namespace Chirp.Infrastructure.Migrations -{ - [DbContext(typeof(ApplicationDbContext))] - [Migration("20241126201925_AppDbContext")] - partial class AppDbContext - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder.HasAnnotation("ProductVersion", "8.0.10"); - - modelBuilder.Entity("Chirp.Core.DataModels.Author", b => - { - b.Property("Id") - .HasColumnType("TEXT"); - - b.Property("AccessFailedCount") - .HasColumnType("INTEGER"); - - b.Property("AuthorId") - .HasColumnType("INTEGER"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .HasColumnType("TEXT"); - - b.Property("Email") - .IsRequired() - .HasMaxLength(256) - .HasColumnType("TEXT"); - - b.Property("EmailConfirmed") - .HasColumnType("INTEGER"); - - b.Property("Follows") - .HasColumnType("TEXT"); - - b.Property("LockoutEnabled") - .HasColumnType("INTEGER"); - - b.Property("LockoutEnd") - .HasColumnType("TEXT"); - - b.Property("NormalizedEmail") - .HasMaxLength(256) - .HasColumnType("TEXT"); - - b.Property("NormalizedUserName") - .HasMaxLength(256) - .HasColumnType("TEXT"); - - b.Property("PasswordHash") - .HasColumnType("TEXT"); - - b.Property("PhoneNumber") - .HasColumnType("TEXT"); - - b.Property("PhoneNumberConfirmed") - .HasColumnType("INTEGER"); - - b.Property("SecurityStamp") - .HasColumnType("TEXT"); - - b.Property("TwoFactorEnabled") - .HasColumnType("INTEGER"); - - b.Property("UserName") - .IsRequired() - .HasMaxLength(256) - .HasColumnType("TEXT"); - - b.HasKey("Id"); - - b.HasIndex("NormalizedEmail") - .HasDatabaseName("EmailIndex"); - - b.HasIndex("NormalizedUserName") - .IsUnique() - .HasDatabaseName("UserNameIndex"); - - b.ToTable("AspNetUsers", (string)null); - }); - - modelBuilder.Entity("Chirp.Core.DataModels.Cheep", b => - { - b.Property("CheepId") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER"); - - b.Property("AuthorId") - .HasColumnType("INTEGER"); - - b.Property("AuthorId1") - .IsRequired() - .HasColumnType("TEXT"); - - b.Property("Text") - .IsRequired() - .HasColumnType("TEXT"); - - b.Property("TimeStamp") - .HasColumnType("TEXT"); - - b.HasKey("CheepId"); - - b.HasIndex("AuthorId1"); - - b.ToTable("Cheeps"); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b => - { - b.Property("Id") - .HasColumnType("TEXT"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .HasColumnType("TEXT"); - - b.Property("Name") - .HasMaxLength(256) - .HasColumnType("TEXT"); - - b.Property("NormalizedName") - .HasMaxLength(256) - .HasColumnType("TEXT"); - - b.HasKey("Id"); - - b.HasIndex("NormalizedName") - .IsUnique() - .HasDatabaseName("RoleNameIndex"); - - b.ToTable("AspNetRoles", (string)null); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER"); - - b.Property("ClaimType") - .HasColumnType("TEXT"); - - b.Property("ClaimValue") - .HasColumnType("TEXT"); - - b.Property("RoleId") - .IsRequired() - .HasColumnType("TEXT"); - - b.HasKey("Id"); - - b.HasIndex("RoleId"); - - b.ToTable("AspNetRoleClaims", (string)null); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER"); - - b.Property("ClaimType") - .HasColumnType("TEXT"); - - b.Property("ClaimValue") - .HasColumnType("TEXT"); - - b.Property("UserId") - .IsRequired() - .HasColumnType("TEXT"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("AspNetUserClaims", (string)null); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => - { - b.Property("LoginProvider") - .HasMaxLength(128) - .HasColumnType("TEXT"); - - b.Property("ProviderKey") - .HasMaxLength(128) - .HasColumnType("TEXT"); - - b.Property("ProviderDisplayName") - .HasColumnType("TEXT"); - - b.Property("UserId") - .IsRequired() - .HasColumnType("TEXT"); - - b.HasKey("LoginProvider", "ProviderKey"); - - b.HasIndex("UserId"); - - b.ToTable("AspNetUserLogins", (string)null); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => - { - b.Property("UserId") - .HasColumnType("TEXT"); - - b.Property("RoleId") - .HasColumnType("TEXT"); - - b.HasKey("UserId", "RoleId"); - - b.HasIndex("RoleId"); - - b.ToTable("AspNetUserRoles", (string)null); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => - { - b.Property("UserId") - .HasColumnType("TEXT"); - - b.Property("LoginProvider") - .HasMaxLength(128) - .HasColumnType("TEXT"); - - b.Property("Name") - .HasMaxLength(128) - .HasColumnType("TEXT"); - - b.Property("Value") - .HasColumnType("TEXT"); - - b.HasKey("UserId", "LoginProvider", "Name"); - - b.ToTable("AspNetUserTokens", (string)null); - }); - - modelBuilder.Entity("Chirp.Core.DataModels.Cheep", b => - { - b.HasOne("Chirp.Core.DataModels.Author", "Author") - .WithMany("Cheeps") - .HasForeignKey("AuthorId1") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Author"); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => - { - b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) - .WithMany() - .HasForeignKey("RoleId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => - { - b.HasOne("Chirp.Core.DataModels.Author", null) - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => - { - b.HasOne("Chirp.Core.DataModels.Author", null) - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => - { - b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) - .WithMany() - .HasForeignKey("RoleId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Chirp.Core.DataModels.Author", null) - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => - { - b.HasOne("Chirp.Core.DataModels.Author", null) - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Chirp.Core.DataModels.Author", b => - { - b.Navigation("Cheeps"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/src/Chirp.Infrastructure/Migrations/20241126201925_AppDbContext.cs b/src/Chirp.Infrastructure/Migrations/20241126201925_AppDbContext.cs deleted file mode 100644 index 46d128e..0000000 --- a/src/Chirp.Infrastructure/Migrations/20241126201925_AppDbContext.cs +++ /dev/null @@ -1,254 +0,0 @@ -using System; -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace Chirp.Infrastructure.Migrations -{ - /// - public partial class AppDbContext : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.CreateTable( - name: "AspNetRoles", - columns: table => new - { - Id = table.Column(type: "TEXT", nullable: false), - Name = table.Column(type: "TEXT", maxLength: 256, nullable: true), - NormalizedName = table.Column(type: "TEXT", maxLength: 256, nullable: true), - ConcurrencyStamp = table.Column(type: "TEXT", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_AspNetRoles", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "AspNetUsers", - columns: table => new - { - Id = table.Column(type: "TEXT", nullable: false), - AuthorId = table.Column(type: "INTEGER", nullable: false), - Email = table.Column(type: "TEXT", maxLength: 256, nullable: false), - UserName = table.Column(type: "TEXT", maxLength: 256, nullable: false), - Follows = table.Column(type: "TEXT", nullable: true), - NormalizedUserName = table.Column(type: "TEXT", maxLength: 256, nullable: true), - NormalizedEmail = table.Column(type: "TEXT", maxLength: 256, nullable: true), - EmailConfirmed = table.Column(type: "INTEGER", nullable: false), - PasswordHash = table.Column(type: "TEXT", nullable: true), - SecurityStamp = table.Column(type: "TEXT", nullable: true), - ConcurrencyStamp = table.Column(type: "TEXT", nullable: true), - PhoneNumber = table.Column(type: "TEXT", nullable: true), - PhoneNumberConfirmed = table.Column(type: "INTEGER", nullable: false), - TwoFactorEnabled = table.Column(type: "INTEGER", nullable: false), - LockoutEnd = table.Column(type: "TEXT", nullable: true), - LockoutEnabled = table.Column(type: "INTEGER", nullable: false), - AccessFailedCount = table.Column(type: "INTEGER", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_AspNetUsers", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "AspNetRoleClaims", - columns: table => new - { - Id = table.Column(type: "INTEGER", nullable: false) - .Annotation("Sqlite:Autoincrement", true), - RoleId = table.Column(type: "TEXT", nullable: false), - ClaimType = table.Column(type: "TEXT", nullable: true), - ClaimValue = table.Column(type: "TEXT", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_AspNetRoleClaims", x => x.Id); - table.ForeignKey( - name: "FK_AspNetRoleClaims_AspNetRoles_RoleId", - column: x => x.RoleId, - principalTable: "AspNetRoles", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "AspNetUserClaims", - columns: table => new - { - Id = table.Column(type: "INTEGER", nullable: false) - .Annotation("Sqlite:Autoincrement", true), - UserId = table.Column(type: "TEXT", nullable: false), - ClaimType = table.Column(type: "TEXT", nullable: true), - ClaimValue = table.Column(type: "TEXT", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_AspNetUserClaims", x => x.Id); - table.ForeignKey( - name: "FK_AspNetUserClaims_AspNetUsers_UserId", - column: x => x.UserId, - principalTable: "AspNetUsers", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "AspNetUserLogins", - columns: table => new - { - LoginProvider = table.Column(type: "TEXT", maxLength: 128, nullable: false), - ProviderKey = table.Column(type: "TEXT", maxLength: 128, nullable: false), - ProviderDisplayName = table.Column(type: "TEXT", nullable: true), - UserId = table.Column(type: "TEXT", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_AspNetUserLogins", x => new { x.LoginProvider, x.ProviderKey }); - table.ForeignKey( - name: "FK_AspNetUserLogins_AspNetUsers_UserId", - column: x => x.UserId, - principalTable: "AspNetUsers", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "AspNetUserRoles", - columns: table => new - { - UserId = table.Column(type: "TEXT", nullable: false), - RoleId = table.Column(type: "TEXT", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_AspNetUserRoles", x => new { x.UserId, x.RoleId }); - table.ForeignKey( - name: "FK_AspNetUserRoles_AspNetRoles_RoleId", - column: x => x.RoleId, - principalTable: "AspNetRoles", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - table.ForeignKey( - name: "FK_AspNetUserRoles_AspNetUsers_UserId", - column: x => x.UserId, - principalTable: "AspNetUsers", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "AspNetUserTokens", - columns: table => new - { - UserId = table.Column(type: "TEXT", nullable: false), - LoginProvider = table.Column(type: "TEXT", maxLength: 128, nullable: false), - Name = table.Column(type: "TEXT", maxLength: 128, nullable: false), - Value = table.Column(type: "TEXT", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_AspNetUserTokens", x => new { x.UserId, x.LoginProvider, x.Name }); - table.ForeignKey( - name: "FK_AspNetUserTokens_AspNetUsers_UserId", - column: x => x.UserId, - principalTable: "AspNetUsers", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "Cheeps", - columns: table => new - { - CheepId = table.Column(type: "INTEGER", nullable: false) - .Annotation("Sqlite:Autoincrement", true), - AuthorId = table.Column(type: "INTEGER", nullable: false), - Text = table.Column(type: "TEXT", nullable: false), - TimeStamp = table.Column(type: "TEXT", nullable: false), - AuthorId1 = table.Column(type: "TEXT", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_Cheeps", x => x.CheepId); - table.ForeignKey( - name: "FK_Cheeps_AspNetUsers_AuthorId1", - column: x => x.AuthorId1, - principalTable: "AspNetUsers", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateIndex( - name: "IX_AspNetRoleClaims_RoleId", - table: "AspNetRoleClaims", - column: "RoleId"); - - migrationBuilder.CreateIndex( - name: "RoleNameIndex", - table: "AspNetRoles", - column: "NormalizedName", - unique: true); - - migrationBuilder.CreateIndex( - name: "IX_AspNetUserClaims_UserId", - table: "AspNetUserClaims", - column: "UserId"); - - migrationBuilder.CreateIndex( - name: "IX_AspNetUserLogins_UserId", - table: "AspNetUserLogins", - column: "UserId"); - - migrationBuilder.CreateIndex( - name: "IX_AspNetUserRoles_RoleId", - table: "AspNetUserRoles", - column: "RoleId"); - - migrationBuilder.CreateIndex( - name: "EmailIndex", - table: "AspNetUsers", - column: "NormalizedEmail"); - - migrationBuilder.CreateIndex( - name: "UserNameIndex", - table: "AspNetUsers", - column: "NormalizedUserName", - unique: true); - - migrationBuilder.CreateIndex( - name: "IX_Cheeps_AuthorId1", - table: "Cheeps", - column: "AuthorId1"); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropTable( - name: "AspNetRoleClaims"); - - migrationBuilder.DropTable( - name: "AspNetUserClaims"); - - migrationBuilder.DropTable( - name: "AspNetUserLogins"); - - migrationBuilder.DropTable( - name: "AspNetUserRoles"); - - migrationBuilder.DropTable( - name: "AspNetUserTokens"); - - migrationBuilder.DropTable( - name: "Cheeps"); - - migrationBuilder.DropTable( - name: "AspNetRoles"); - - migrationBuilder.DropTable( - name: "AspNetUsers"); - } - } -} diff --git a/src/Chirp.Infrastructure/Migrations/ApplicationDbContextModelSnapshot.cs b/src/Chirp.Infrastructure/Migrations/ApplicationDbContextModelSnapshot.cs deleted file mode 100644 index b55dce2..0000000 --- a/src/Chirp.Infrastructure/Migrations/ApplicationDbContextModelSnapshot.cs +++ /dev/null @@ -1,320 +0,0 @@ -// -using System; -using Chirp.Infrastructure.Data; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; - -#nullable disable - -namespace Chirp.Infrastructure.Migrations -{ - [DbContext(typeof(ApplicationDbContext))] - partial class ApplicationDbContextModelSnapshot : ModelSnapshot - { - protected override void BuildModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder.HasAnnotation("ProductVersion", "8.0.10"); - - modelBuilder.Entity("Chirp.Core.DataModels.Author", b => - { - b.Property("Id") - .HasColumnType("TEXT"); - - b.Property("AccessFailedCount") - .HasColumnType("INTEGER"); - - b.Property("AuthorId") - .HasColumnType("INTEGER"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .HasColumnType("TEXT"); - - b.Property("Email") - .IsRequired() - .HasMaxLength(256) - .HasColumnType("TEXT"); - - b.Property("EmailConfirmed") - .HasColumnType("INTEGER"); - - b.Property("Follows") - .HasColumnType("TEXT"); - - b.Property("LockoutEnabled") - .HasColumnType("INTEGER"); - - b.Property("LockoutEnd") - .HasColumnType("TEXT"); - - b.Property("NormalizedEmail") - .HasMaxLength(256) - .HasColumnType("TEXT"); - - b.Property("NormalizedUserName") - .HasMaxLength(256) - .HasColumnType("TEXT"); - - b.Property("PasswordHash") - .HasColumnType("TEXT"); - - b.Property("PhoneNumber") - .HasColumnType("TEXT"); - - b.Property("PhoneNumberConfirmed") - .HasColumnType("INTEGER"); - - b.Property("SecurityStamp") - .HasColumnType("TEXT"); - - b.Property("TwoFactorEnabled") - .HasColumnType("INTEGER"); - - b.Property("UserName") - .IsRequired() - .HasMaxLength(256) - .HasColumnType("TEXT"); - - b.HasKey("Id"); - - b.HasIndex("NormalizedEmail") - .HasDatabaseName("EmailIndex"); - - b.HasIndex("NormalizedUserName") - .IsUnique() - .HasDatabaseName("UserNameIndex"); - - b.ToTable("AspNetUsers", (string)null); - }); - - modelBuilder.Entity("Chirp.Core.DataModels.Cheep", b => - { - b.Property("CheepId") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER"); - - b.Property("AuthorId") - .HasColumnType("INTEGER"); - - b.Property("AuthorId1") - .IsRequired() - .HasColumnType("TEXT"); - - b.Property("Text") - .IsRequired() - .HasColumnType("TEXT"); - - b.Property("TimeStamp") - .HasColumnType("TEXT"); - - b.HasKey("CheepId"); - - b.HasIndex("AuthorId1"); - - b.ToTable("Cheeps"); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b => - { - b.Property("Id") - .HasColumnType("TEXT"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .HasColumnType("TEXT"); - - b.Property("Name") - .HasMaxLength(256) - .HasColumnType("TEXT"); - - b.Property("NormalizedName") - .HasMaxLength(256) - .HasColumnType("TEXT"); - - b.HasKey("Id"); - - b.HasIndex("NormalizedName") - .IsUnique() - .HasDatabaseName("RoleNameIndex"); - - b.ToTable("AspNetRoles", (string)null); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER"); - - b.Property("ClaimType") - .HasColumnType("TEXT"); - - b.Property("ClaimValue") - .HasColumnType("TEXT"); - - b.Property("RoleId") - .IsRequired() - .HasColumnType("TEXT"); - - b.HasKey("Id"); - - b.HasIndex("RoleId"); - - b.ToTable("AspNetRoleClaims", (string)null); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER"); - - b.Property("ClaimType") - .HasColumnType("TEXT"); - - b.Property("ClaimValue") - .HasColumnType("TEXT"); - - b.Property("UserId") - .IsRequired() - .HasColumnType("TEXT"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("AspNetUserClaims", (string)null); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => - { - b.Property("LoginProvider") - .HasMaxLength(128) - .HasColumnType("TEXT"); - - b.Property("ProviderKey") - .HasMaxLength(128) - .HasColumnType("TEXT"); - - b.Property("ProviderDisplayName") - .HasColumnType("TEXT"); - - b.Property("UserId") - .IsRequired() - .HasColumnType("TEXT"); - - b.HasKey("LoginProvider", "ProviderKey"); - - b.HasIndex("UserId"); - - b.ToTable("AspNetUserLogins", (string)null); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => - { - b.Property("UserId") - .HasColumnType("TEXT"); - - b.Property("RoleId") - .HasColumnType("TEXT"); - - b.HasKey("UserId", "RoleId"); - - b.HasIndex("RoleId"); - - b.ToTable("AspNetUserRoles", (string)null); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => - { - b.Property("UserId") - .HasColumnType("TEXT"); - - b.Property("LoginProvider") - .HasMaxLength(128) - .HasColumnType("TEXT"); - - b.Property("Name") - .HasMaxLength(128) - .HasColumnType("TEXT"); - - b.Property("Value") - .HasColumnType("TEXT"); - - b.HasKey("UserId", "LoginProvider", "Name"); - - b.ToTable("AspNetUserTokens", (string)null); - }); - - modelBuilder.Entity("Chirp.Core.DataModels.Cheep", b => - { - b.HasOne("Chirp.Core.DataModels.Author", "Author") - .WithMany("Cheeps") - .HasForeignKey("AuthorId1") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Author"); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => - { - b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) - .WithMany() - .HasForeignKey("RoleId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => - { - b.HasOne("Chirp.Core.DataModels.Author", null) - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => - { - b.HasOne("Chirp.Core.DataModels.Author", null) - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => - { - b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) - .WithMany() - .HasForeignKey("RoleId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Chirp.Core.DataModels.Author", null) - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => - { - b.HasOne("Chirp.Core.DataModels.Author", null) - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Chirp.Core.DataModels.Author", b => - { - b.Navigation("Cheeps"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/src/Chirp.Infrastructure/Repositories/AuthorRepository.cs b/src/Chirp.Infrastructure/Repositories/AuthorRepository.cs index 602edce..f74c08b 100644 --- a/src/Chirp.Infrastructure/Repositories/AuthorRepository.cs +++ b/src/Chirp.Infrastructure/Repositories/AuthorRepository.cs @@ -189,7 +189,7 @@ public async Task ContainsFollower(string you, string me) { var author = await _context.Authors .FirstAsync(a => a.UserName == me); - return author.Follows.Contains(you); + return author.Follows.Contains(you.ToLower()); } diff --git a/src/Chirp.Web/Pages/Public.cshtml b/src/Chirp.Web/Pages/Public.cshtml index 7546b70..7e50c37 100644 --- a/src/Chirp.Web/Pages/Public.cshtml +++ b/src/Chirp.Web/Pages/Public.cshtml @@ -52,7 +52,7 @@ @if (User.Identity?.Name != null && !User.Identity.Name.Equals(cheep.Author)) { var user = ChirpService.GetAuthorByName(User.Identity.Name).Result; - var follows = user?.Follows != null && user.Follows.Contains(@cheep.Author); + var follows = user?.Follows != null && user.Follows.Contains(@cheep.Author.ToLower()); diff --git a/src/Chirp.Web/Pages/UserTimeline.cshtml b/src/Chirp.Web/Pages/UserTimeline.cshtml index b42c43d..057453c 100644 --- a/src/Chirp.Web/Pages/UserTimeline.cshtml +++ b/src/Chirp.Web/Pages/UserTimeline.cshtml @@ -12,9 +12,10 @@ if (routeName != null && routeName.Contains('@')) { routeName = ChirpService.GetAuthorByEmail(routeName).Result?.Name; - } -} + } + if (routeName != null && routeName.Equals("Oauth.styles.css")) return; +}
@if (SignInManager.IsSignedIn(User) && routeName != null) { @@ -80,13 +81,6 @@ } else { -
- @* @if (routeName != null) *@ - @* { *@ - @* @(_ = Model.FetchCheeps(routeName)) *@ - @* } *@ -
-
    @foreach (var cheep in Model.Cheeps) { @@ -105,17 +99,6 @@ } else { -
    - @* @if (routeName != null) *@ - @* { *@ - @* @(_ = Model.FetchCheeps(routeName)) *@ - @* } *@ - @if (routeName != null && routeName.Contains('@')) - { - routeName = ChirpService.GetAuthorByEmail(routeName).Result?.Name; - } -
    -
      @foreach (var cheep in Model.Cheeps) { @@ -132,37 +115,6 @@
    } } - @* else if(Model.Cheeps==null) *@ - @* { *@ - @* You can't cheep that! Cheep is empty! *@ - @* *@ - @*
    *@ - @* @if (routeName != null) *@ - @* { *@ - @* @(_ = Model.FetchCheeps(routeName)) *@ - @* } *@ - @* *@ - @*
    *@ - @* { *@ - @*
      *@ - @* @if (Model.Cheeps != null) *@ - @* { *@ - @* foreach (var cheep in Model.Cheeps) *@ - @* { *@ - @*
    • *@ - @*

      *@ - @* *@ - @* @cheep.Author *@ - @* *@ - @* @cheep.Text *@ - @* — @cheep.TimeStamp *@ - @*

      *@ - @*
    • *@ - @* } *@ - @* } *@ - @*
    *@ - @* } *@ - @* } *@ else{ There are no cheeps so far. diff --git a/src/Chirp.Web/Pages/UserTimeline.cshtml.cs b/src/Chirp.Web/Pages/UserTimeline.cshtml.cs index a2c50b9..f957df2 100644 --- a/src/Chirp.Web/Pages/UserTimeline.cshtml.cs +++ b/src/Chirp.Web/Pages/UserTimeline.cshtml.cs @@ -151,7 +151,17 @@ private async Task SearchByEmail(string author) if (User.Identity != null && User.Identity.Name == createdAuthor.Name) { Cheeps = await _chirpService.GetCheepsFollowedByAuthor(CurrentPage, createdAuthor.Name, createdAuthor.Follows); - Count = await _chirpService.GetCheepsCountByFollows(author, createdAuthor.Follows); + if (createdAuthor.Follows.IsNullOrEmpty()) + { + var cheepDtos = _chirpService.ReadAllCheeps(createdAuthor.Name).Result; + if (cheepDtos != null) + Count = cheepDtos.Count; + } + else + { + Count = await _chirpService.GetCheepsCountByFollows(author, createdAuthor.Follows); + + } } else { @@ -183,14 +193,24 @@ private async Task SearchByName(string author) if (User.Identity != null && User.Identity.Name == createdAuthor.Name) { Cheeps = await _chirpService.GetCheepsFollowedByAuthor(CurrentPage, createdAuthor.Name, createdAuthor.Follows); - Count = await _chirpService.GetCheepsCountByFollows(author, createdAuthor.Follows); + if (createdAuthor.Follows.IsNullOrEmpty()) + { + var cheepDtos = _chirpService.ReadAllCheeps(createdAuthor.Name).Result; + if (cheepDtos != null) + Count = cheepDtos.Count; + } + else + { + Count = await _chirpService.GetCheepsCountByFollows(author, createdAuthor.Follows); + + } } else { Cheeps = await _chirpService.ReadByAuthor(CurrentPage, createdAuthor.Name); var cheepDtos = _chirpService.ReadAllCheeps(createdAuthor.Name).Result; if (cheepDtos != null) - Count = cheepDtos.Count(); + Count = cheepDtos.Count; } } From 02f24344c97da0f489ee005164f2fe2b06d68878 Mon Sep 17 00:00:00 2001 From: Nicky Ye Date: Mon, 16 Dec 2024 13:21:57 +0100 Subject: [PATCH 3/3] fix tests --- test/Chirp.Razor.Test/AuthorRepositoryTests.cs | 4 ++-- test/PlaywrightTests/End2endtests.cs | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/test/Chirp.Razor.Test/AuthorRepositoryTests.cs b/test/Chirp.Razor.Test/AuthorRepositoryTests.cs index 01b2414..854e98b 100644 --- a/test/Chirp.Razor.Test/AuthorRepositoryTests.cs +++ b/test/Chirp.Razor.Test/AuthorRepositoryTests.cs @@ -212,7 +212,7 @@ public async Task TestAddFollows() //Assert Assert.NotEmpty(authorfollows); - Assert.Contains("Roger Histand", authorfollows); + Assert.Contains("roger histand", authorfollows); } [Fact] @@ -248,7 +248,7 @@ public async Task TestRemoveFollows() var authorfollows = await aRepository.GetFollowed("Test Author"); //Assert - Assert.DoesNotContain("Roger Histand", authorfollows); + Assert.DoesNotContain("Roger histand", authorfollows); Assert.Contains("Luanna Muro", authorfollows); } } \ No newline at end of file diff --git a/test/PlaywrightTests/End2endtests.cs b/test/PlaywrightTests/End2endtests.cs index fb392a9..26f6ab2 100644 --- a/test/PlaywrightTests/End2endtests.cs +++ b/test/PlaywrightTests/End2endtests.cs @@ -206,7 +206,7 @@ public async Task JShowFollowsButtonsWork() public async Task KUserCanSearchByEmail() { await Page.GotoAsync("http://localhost:5177/testuser@gmail.com"); - await Expect(Page.GetByText("testuser")).ToBeVisibleAsync(); + await Expect(Page.GetByText("testuser's Timeline")).ToBeVisibleAsync(); } [Test]