From 33db1368ecac16b00fc5ae3e2c6e8595237e9140 Mon Sep 17 00:00:00 2001 From: Aaron Po Date: Tue, 11 Nov 2025 03:45:01 -0500 Subject: [PATCH] Refactor schema and test data; remove DAL code Removed all DataAccessLayer C# code and related test project files. Updated schema.sql to add Country, StateProvince, and City tables, refactored brewery and beer post tables to include location and concurrency columns, and replaced the old comment/rating system with BeerPostComment. Updated test-data.sql to seed new location tables and refactored brewery data to use city and coordinates. --- .config/dotnet-tools.json | 13 + .../DataAccessLayer-Tests.csproj | 23 -- DataAccessLayer/BeerPost.cs | 35 -- DataAccessLayer/BeerPostPhoto.cs | 19 -- DataAccessLayer/BeerStyle.cs | 15 - DataAccessLayer/BiergartenContext.cs | 300 ----------------- DataAccessLayer/BreweryPost.cs | 23 -- DataAccessLayer/BreweryPostPhoto.cs | 19 -- DataAccessLayer/Comment.cs | 15 - DataAccessLayer/DataAccessLayer.csproj | 18 - DataAccessLayer/Photo.cs | 23 -- DataAccessLayer/UserAccount.cs | 41 --- DataAccessLayer/UserAvatar.cs | 17 - DataAccessLayer/UserCredential.cs | 19 -- DataAccessLayer/UserFollow.cs | 19 -- DataAccessLayer/UserVerification.cs | 15 - biergarten.sln | 6 + schema.sql | 144 ++++++-- test-data.sql | 310 ++++++------------ 19 files changed, 246 insertions(+), 828 deletions(-) create mode 100644 .config/dotnet-tools.json delete mode 100644 DataAccessLayer-Tests/DataAccessLayer-Tests.csproj delete mode 100644 DataAccessLayer/BeerPost.cs delete mode 100644 DataAccessLayer/BeerPostPhoto.cs delete mode 100644 DataAccessLayer/BeerStyle.cs delete mode 100644 DataAccessLayer/BiergartenContext.cs delete mode 100644 DataAccessLayer/BreweryPost.cs delete mode 100644 DataAccessLayer/BreweryPostPhoto.cs delete mode 100644 DataAccessLayer/Comment.cs delete mode 100644 DataAccessLayer/DataAccessLayer.csproj delete mode 100644 DataAccessLayer/Photo.cs delete mode 100644 DataAccessLayer/UserAccount.cs delete mode 100644 DataAccessLayer/UserAvatar.cs delete mode 100644 DataAccessLayer/UserCredential.cs delete mode 100644 DataAccessLayer/UserFollow.cs delete mode 100644 DataAccessLayer/UserVerification.cs diff --git a/.config/dotnet-tools.json b/.config/dotnet-tools.json new file mode 100644 index 0000000..321b5d6 --- /dev/null +++ b/.config/dotnet-tools.json @@ -0,0 +1,13 @@ +{ + "version": 1, + "isRoot": true, + "tools": { + "csharpier": { + "version": "1.1.2", + "commands": [ + "csharpier" + ], + "rollForward": false + } + } +} \ No newline at end of file diff --git a/DataAccessLayer-Tests/DataAccessLayer-Tests.csproj b/DataAccessLayer-Tests/DataAccessLayer-Tests.csproj deleted file mode 100644 index 9c5b30a..0000000 --- a/DataAccessLayer-Tests/DataAccessLayer-Tests.csproj +++ /dev/null @@ -1,23 +0,0 @@ - - - - net8.0 - enable - enable - - false - true - - - - - - - - - - - - - - diff --git a/DataAccessLayer/BeerPost.cs b/DataAccessLayer/BeerPost.cs deleted file mode 100644 index 3242b91..0000000 --- a/DataAccessLayer/BeerPost.cs +++ /dev/null @@ -1,35 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace DataAccessLayer; - -public partial class BeerPost -{ - public Guid BeerPostID { get; set; } - - public string Name { get; set; } = null!; - - public string Description { get; set; } = null!; - - public decimal ABV { get; set; } - - public int IBU { get; set; } - - public Guid PostedByID { get; set; } - - public Guid BeerStyleID { get; set; } - - public Guid BrewedByID { get; set; } - - public DateTime CreatedAt { get; set; } - - public DateTime? UpdatedAt { get; set; } - - public virtual ICollection BeerPostPhotos { get; set; } = new List(); - - public virtual BeerStyle BeerStyle { get; set; } = null!; - - public virtual BreweryPost BrewedBy { get; set; } = null!; - - public virtual UserAccount PostedBy { get; set; } = null!; -} diff --git a/DataAccessLayer/BeerPostPhoto.cs b/DataAccessLayer/BeerPostPhoto.cs deleted file mode 100644 index cdb8963..0000000 --- a/DataAccessLayer/BeerPostPhoto.cs +++ /dev/null @@ -1,19 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace DataAccessLayer; - -public partial class BeerPostPhoto -{ - public Guid BeerPostPhotoID { get; set; } - - public Guid BeerPostID { get; set; } - - public Guid PhotoID { get; set; } - - public DateTime LinkedAt { get; set; } - - public virtual BeerPost BeerPost { get; set; } = null!; - - public virtual Photo Photo { get; set; } = null!; -} diff --git a/DataAccessLayer/BeerStyle.cs b/DataAccessLayer/BeerStyle.cs deleted file mode 100644 index 4af1a81..0000000 --- a/DataAccessLayer/BeerStyle.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace DataAccessLayer; - -public partial class BeerStyle -{ - public Guid BeerStyleID { get; set; } - - public string StyleName { get; set; } = null!; - - public string? Description { get; set; } - - public virtual ICollection BeerPosts { get; set; } = new List(); -} diff --git a/DataAccessLayer/BiergartenContext.cs b/DataAccessLayer/BiergartenContext.cs deleted file mode 100644 index 883a87d..0000000 --- a/DataAccessLayer/BiergartenContext.cs +++ /dev/null @@ -1,300 +0,0 @@ -using System; -using System.Collections.Generic; -using Microsoft.EntityFrameworkCore; - -namespace DataAccessLayer; - -public partial class BiergartenContext : DbContext -{ - public BiergartenContext() - { - } - - public BiergartenContext(DbContextOptions options) - : base(options) - { - } - - public virtual DbSet BeerPosts { get; set; } - - public virtual DbSet BeerPostPhotos { get; set; } - - public virtual DbSet BeerStyles { get; set; } - - public virtual DbSet BreweryPosts { get; set; } - - public virtual DbSet BreweryPostPhotos { get; set; } - - public virtual DbSet Comments { get; set; } - - public virtual DbSet Photos { get; set; } - - public virtual DbSet UserAccounts { get; set; } - - public virtual DbSet UserAvatars { get; set; } - - public virtual DbSet UserCredentials { get; set; } - - public virtual DbSet UserFollows { get; set; } - - public virtual DbSet UserVerifications { get; set; } - - protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) -#warning To protect potentially sensitive information in your connection string, you should move it out of source code. You can avoid scaffolding the connection string by using the Name= syntax to read it from configuration - see https://go.microsoft.com/fwlink/?linkid=2131148. For more guidance on storing connection strings, see https://go.microsoft.com/fwlink/?LinkId=723263. - => optionsBuilder.UseSqlServer("Server=(localdb)\\ProjectModels;Database=Biergarten;Trusted_Connection=True;"); - - protected override void OnModelCreating(ModelBuilder modelBuilder) - { - modelBuilder.Entity(entity => - { - entity.ToTable("BeerPost"); - - entity.HasIndex(e => e.BeerStyleID, "IX_BeerPost_BeerStyle"); - - entity.HasIndex(e => e.BrewedByID, "IX_BeerPost_BrewedBy"); - - entity.HasIndex(e => e.PostedByID, "IX_BeerPost_PostedBy"); - - entity.Property(e => e.BeerPostID).HasDefaultValueSql("(newid())"); - entity.Property(e => e.ABV).HasColumnType("decimal(4, 2)"); - entity.Property(e => e.CreatedAt) - .HasDefaultValueSql("(getdate())") - .HasColumnType("datetime"); - entity.Property(e => e.Name).HasMaxLength(100); - entity.Property(e => e.UpdatedAt).HasColumnType("datetime"); - - entity.HasOne(d => d.BeerStyle).WithMany(p => p.BeerPosts) - .HasForeignKey(d => d.BeerStyleID) - .OnDelete(DeleteBehavior.ClientSetNull) - .HasConstraintName("FK_BeerPost_BeerStyle"); - - entity.HasOne(d => d.BrewedBy).WithMany(p => p.BeerPosts) - .HasForeignKey(d => d.BrewedByID) - .OnDelete(DeleteBehavior.ClientSetNull) - .HasConstraintName("FK_BeerPost_Brewery"); - - entity.HasOne(d => d.PostedBy).WithMany(p => p.BeerPosts) - .HasForeignKey(d => d.PostedByID) - .OnDelete(DeleteBehavior.ClientSetNull) - .HasConstraintName("FK_BeerPost_PostedBy"); - }); - - modelBuilder.Entity(entity => - { - entity.ToTable("BeerPostPhoto"); - - entity.HasIndex(e => new { e.BeerPostID, e.PhotoID }, "IX_BeerPostPhoto_BeerPost_Photo"); - - entity.HasIndex(e => new { e.PhotoID, e.BeerPostID }, "IX_BeerPostPhoto_Photo_BeerPost"); - - entity.Property(e => e.BeerPostPhotoID).HasDefaultValueSql("(newid())"); - entity.Property(e => e.LinkedAt) - .HasDefaultValueSql("(getdate())") - .HasColumnType("datetime"); - - entity.HasOne(d => d.BeerPost).WithMany(p => p.BeerPostPhotos) - .HasForeignKey(d => d.BeerPostID) - .HasConstraintName("FK_BeerPostPhoto_BeerPost"); - - entity.HasOne(d => d.Photo).WithMany(p => p.BeerPostPhotos) - .HasForeignKey(d => d.PhotoID) - .HasConstraintName("FK_BeerPostPhoto_Photo"); - }); - - modelBuilder.Entity(entity => - { - entity.ToTable("BeerStyle"); - - entity.HasIndex(e => e.StyleName, "AK_BeerStyle_StyleName").IsUnique(); - - entity.Property(e => e.BeerStyleID).HasDefaultValueSql("(newid())"); - entity.Property(e => e.StyleName).HasMaxLength(100); - }); - - modelBuilder.Entity(entity => - { - entity.ToTable("BreweryPost"); - - entity.HasIndex(e => e.PostedByID, "IX_BreweryPost_PostedByID"); - - entity.Property(e => e.BreweryPostID).HasDefaultValueSql("(newid())"); - entity.Property(e => e.CreatedAt) - .HasDefaultValueSql("(getdate())") - .HasColumnType("datetime"); - entity.Property(e => e.Description).HasMaxLength(512); - entity.Property(e => e.UpdatedAt).HasColumnType("datetime"); - - entity.HasOne(d => d.PostedBy).WithMany(p => p.BreweryPosts) - .HasForeignKey(d => d.PostedByID) - .OnDelete(DeleteBehavior.ClientSetNull) - .HasConstraintName("FK_BreweryPost_UserAccount"); - }); - - modelBuilder.Entity(entity => - { - entity.ToTable("BreweryPostPhoto"); - - entity.HasIndex(e => new { e.BreweryPostID, e.PhotoID }, "IX_BreweryPostPhoto_BreweryPost_Photo"); - - entity.HasIndex(e => new { e.PhotoID, e.BreweryPostID }, "IX_BreweryPostPhoto_Photo_BreweryPost"); - - entity.Property(e => e.BreweryPostPhotoID).HasDefaultValueSql("(newid())"); - entity.Property(e => e.LinkedAt) - .HasDefaultValueSql("(getdate())") - .HasColumnType("datetime"); - - entity.HasOne(d => d.BreweryPost).WithMany(p => p.BreweryPostPhotos) - .HasForeignKey(d => d.BreweryPostID) - .HasConstraintName("FK_BreweryPostPhoto_BreweryPost"); - - entity.HasOne(d => d.Photo).WithMany(p => p.BreweryPostPhotos) - .HasForeignKey(d => d.PhotoID) - .HasConstraintName("FK_BreweryPostPhoto_Photo"); - }); - - modelBuilder.Entity(entity => - { - entity.HasKey(e => e.CommentID).HasName("PK_CommentID"); - - entity.ToTable("Comment"); - - entity.HasIndex(e => e.PostedByID, "IX_Comment_PostedByID"); - - entity.Property(e => e.CommentID).HasDefaultValueSql("(newid())"); - entity.Property(e => e.CommentText).HasMaxLength(512); - - entity.HasOne(d => d.PostedBy).WithMany(p => p.Comments) - .HasForeignKey(d => d.PostedByID) - .OnDelete(DeleteBehavior.ClientSetNull) - .HasConstraintName("FK_PostedByID"); - }); - - modelBuilder.Entity(entity => - { - entity.ToTable("Photo"); - - entity.HasIndex(e => e.UploadedByID, "IX_Photo_UploadedByID"); - - entity.Property(e => e.PhotoID).HasDefaultValueSql("(newid())"); - entity.Property(e => e.Hyperlink).HasMaxLength(256); - entity.Property(e => e.UploadedAt) - .HasDefaultValueSql("(getdate())") - .HasColumnType("datetime"); - - entity.HasOne(d => d.UploadedBy).WithMany(p => p.Photos) - .HasForeignKey(d => d.UploadedByID) - .OnDelete(DeleteBehavior.ClientSetNull) - .HasConstraintName("FK_Photo_UploadedBy"); - }); - - modelBuilder.Entity(entity => - { - entity.ToTable("UserAccount"); - - entity.HasIndex(e => e.Email, "AK_Email").IsUnique(); - - entity.HasIndex(e => e.Username, "AK_Username").IsUnique(); - - entity.Property(e => e.UserAccountID).HasDefaultValueSql("(newid())"); - entity.Property(e => e.CreatedAt).HasColumnType("datetime"); - entity.Property(e => e.DateOfBirth).HasColumnType("datetime"); - entity.Property(e => e.Email) - .HasMaxLength(128) - .IsUnicode(false); - entity.Property(e => e.FirstName).HasMaxLength(128); - entity.Property(e => e.LastName).HasMaxLength(128); - entity.Property(e => e.UpdatedAt).HasColumnType("datetime"); - entity.Property(e => e.Username) - .HasMaxLength(64) - .IsUnicode(false); - }); - - modelBuilder.Entity(entity => - { - entity.ToTable("UserAvatar"); - - entity.HasIndex(e => e.UserAccountID, "AK_UserAvatar_UserAccountID").IsUnique(); - - entity.HasIndex(e => e.UserAccountID, "IX_UserAvatar_UserAccount"); - - entity.Property(e => e.UserAvatarID).HasDefaultValueSql("(newid())"); - - entity.HasOne(d => d.Photo).WithMany(p => p.UserAvatars) - .HasForeignKey(d => d.PhotoID) - .OnDelete(DeleteBehavior.ClientSetNull) - .HasConstraintName("FK_UserAvatar_PhotoID"); - - entity.HasOne(d => d.UserAccount).WithOne(p => p.UserAvatar) - .HasForeignKey(d => d.UserAccountID) - .HasConstraintName("FK_UserAvatar_UserAccount"); - }); - - modelBuilder.Entity(entity => - { - entity.ToTable("UserCredential"); - - entity.HasIndex(e => e.UserAccountID, "AK_UserCredential_UserAccountID").IsUnique(); - - entity.HasIndex(e => e.UserAccountID, "IX_UserCredential_UserAccount"); - - entity.Property(e => e.UserCredentialID).HasDefaultValueSql("(newid())"); - entity.Property(e => e.CreatedAt) - .HasDefaultValueSql("(getdate())") - .HasColumnType("datetime"); - entity.Property(e => e.Expiry) - .HasDefaultValueSql("(dateadd(day,(90),getdate()))") - .HasColumnType("datetime"); - entity.Property(e => e.Hash).HasMaxLength(100); - - entity.HasOne(d => d.UserAccount).WithOne(p => p.UserCredential) - .HasForeignKey(d => d.UserAccountID) - .HasConstraintName("FK_UserCredential_UserAccount"); - }); - - modelBuilder.Entity(entity => - { - entity.ToTable("UserFollow"); - - entity.HasIndex(e => new { e.FollowingID, e.UserAccountID }, "IX_UserFollow_FollowingID_UserAccount"); - - entity.HasIndex(e => new { e.UserAccountID, e.FollowingID }, "IX_UserFollow_UserAccount_FollowingID"); - - entity.Property(e => e.UserFollowID).HasDefaultValueSql("(newid())"); - entity.Property(e => e.CreatedAt) - .HasDefaultValueSql("(getdate())") - .HasColumnType("datetime"); - - entity.HasOne(d => d.Following).WithMany(p => p.UserFollowFollowings) - .HasForeignKey(d => d.FollowingID) - .OnDelete(DeleteBehavior.ClientSetNull) - .HasConstraintName("FK_UserFollow_UserAccountFollowing"); - - entity.HasOne(d => d.UserAccount).WithMany(p => p.UserFollowUserAccounts) - .HasForeignKey(d => d.UserAccountID) - .OnDelete(DeleteBehavior.ClientSetNull) - .HasConstraintName("FK_UserFollow_UserAccount"); - }); - - modelBuilder.Entity(entity => - { - entity.ToTable("UserVerification"); - - entity.HasIndex(e => e.UserAccountID, "AK_UserVerification_UserAccountID").IsUnique(); - - entity.HasIndex(e => e.UserAccountID, "IX_UserVerification_UserAccount"); - - entity.Property(e => e.UserVerificationID).HasDefaultValueSql("(newid())"); - entity.Property(e => e.VerificationDateTime) - .HasDefaultValueSql("(getdate())") - .HasColumnType("datetime"); - - entity.HasOne(d => d.UserAccount).WithOne(p => p.UserVerification) - .HasForeignKey(d => d.UserAccountID) - .HasConstraintName("FK_UserVerification_UserAccount"); - }); - - OnModelCreatingPartial(modelBuilder); - } - - partial void OnModelCreatingPartial(ModelBuilder modelBuilder); -} diff --git a/DataAccessLayer/BreweryPost.cs b/DataAccessLayer/BreweryPost.cs deleted file mode 100644 index c706b98..0000000 --- a/DataAccessLayer/BreweryPost.cs +++ /dev/null @@ -1,23 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace DataAccessLayer; - -public partial class BreweryPost -{ - public Guid BreweryPostID { get; set; } - - public Guid PostedByID { get; set; } - - public string Description { get; set; } = null!; - - public DateTime CreatedAt { get; set; } - - public DateTime? UpdatedAt { get; set; } - - public virtual ICollection BeerPosts { get; set; } = new List(); - - public virtual ICollection BreweryPostPhotos { get; set; } = new List(); - - public virtual UserAccount PostedBy { get; set; } = null!; -} diff --git a/DataAccessLayer/BreweryPostPhoto.cs b/DataAccessLayer/BreweryPostPhoto.cs deleted file mode 100644 index 1191ae6..0000000 --- a/DataAccessLayer/BreweryPostPhoto.cs +++ /dev/null @@ -1,19 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace DataAccessLayer; - -public partial class BreweryPostPhoto -{ - public Guid BreweryPostPhotoID { get; set; } - - public Guid BreweryPostID { get; set; } - - public Guid PhotoID { get; set; } - - public DateTime LinkedAt { get; set; } - - public virtual BreweryPost BreweryPost { get; set; } = null!; - - public virtual Photo Photo { get; set; } = null!; -} diff --git a/DataAccessLayer/Comment.cs b/DataAccessLayer/Comment.cs deleted file mode 100644 index 4eb0a84..0000000 --- a/DataAccessLayer/Comment.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace DataAccessLayer; - -public partial class Comment -{ - public Guid CommentID { get; set; } - - public string? CommentText { get; set; } - - public Guid PostedByID { get; set; } - - public virtual UserAccount PostedBy { get; set; } = null!; -} diff --git a/DataAccessLayer/DataAccessLayer.csproj b/DataAccessLayer/DataAccessLayer.csproj deleted file mode 100644 index bb3f681..0000000 --- a/DataAccessLayer/DataAccessLayer.csproj +++ /dev/null @@ -1,18 +0,0 @@ - - - - net8.0 - DataAccessLayer - enable - enable - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - diff --git a/DataAccessLayer/Photo.cs b/DataAccessLayer/Photo.cs deleted file mode 100644 index ba2b881..0000000 --- a/DataAccessLayer/Photo.cs +++ /dev/null @@ -1,23 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace DataAccessLayer; - -public partial class Photo -{ - public Guid PhotoID { get; set; } - - public string? Hyperlink { get; set; } - - public Guid UploadedByID { get; set; } - - public DateTime UploadedAt { get; set; } - - public virtual ICollection BeerPostPhotos { get; set; } = new List(); - - public virtual ICollection BreweryPostPhotos { get; set; } = new List(); - - public virtual UserAccount UploadedBy { get; set; } = null!; - - public virtual ICollection UserAvatars { get; set; } = new List(); -} diff --git a/DataAccessLayer/UserAccount.cs b/DataAccessLayer/UserAccount.cs deleted file mode 100644 index a09ed2c..0000000 --- a/DataAccessLayer/UserAccount.cs +++ /dev/null @@ -1,41 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace DataAccessLayer; - -public partial class UserAccount -{ - public Guid UserAccountID { get; set; } - - public string Username { get; set; } = null!; - - public string FirstName { get; set; } = null!; - - public string LastName { get; set; } = null!; - - public string Email { get; set; } = null!; - - public DateTime CreatedAt { get; set; } - - public DateTime? UpdatedAt { get; set; } - - public DateTime DateOfBirth { get; set; } - - public virtual ICollection BeerPosts { get; set; } = new List(); - - public virtual ICollection BreweryPosts { get; set; } = new List(); - - public virtual ICollection Comments { get; set; } = new List(); - - public virtual ICollection Photos { get; set; } = new List(); - - public virtual UserAvatar? UserAvatar { get; set; } - - public virtual UserCredential? UserCredential { get; set; } - - public virtual ICollection UserFollowFollowings { get; set; } = new List(); - - public virtual ICollection UserFollowUserAccounts { get; set; } = new List(); - - public virtual UserVerification? UserVerification { get; set; } -} diff --git a/DataAccessLayer/UserAvatar.cs b/DataAccessLayer/UserAvatar.cs deleted file mode 100644 index d9b9aba..0000000 --- a/DataAccessLayer/UserAvatar.cs +++ /dev/null @@ -1,17 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace DataAccessLayer; - -public partial class UserAvatar -{ - public Guid UserAvatarID { get; set; } - - public Guid UserAccountID { get; set; } - - public Guid PhotoID { get; set; } - - public virtual Photo Photo { get; set; } = null!; - - public virtual UserAccount UserAccount { get; set; } = null!; -} diff --git a/DataAccessLayer/UserCredential.cs b/DataAccessLayer/UserCredential.cs deleted file mode 100644 index 039861c..0000000 --- a/DataAccessLayer/UserCredential.cs +++ /dev/null @@ -1,19 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace DataAccessLayer; - -public partial class UserCredential -{ - public Guid UserCredentialID { get; set; } - - public Guid UserAccountID { get; set; } - - public DateTime CreatedAt { get; set; } - - public DateTime Expiry { get; set; } - - public string Hash { get; set; } = null!; - - public virtual UserAccount UserAccount { get; set; } = null!; -} diff --git a/DataAccessLayer/UserFollow.cs b/DataAccessLayer/UserFollow.cs deleted file mode 100644 index 975672f..0000000 --- a/DataAccessLayer/UserFollow.cs +++ /dev/null @@ -1,19 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace DataAccessLayer; - -public partial class UserFollow -{ - public Guid UserFollowID { get; set; } - - public Guid UserAccountID { get; set; } - - public Guid FollowingID { get; set; } - - public DateTime CreatedAt { get; set; } - - public virtual UserAccount Following { get; set; } = null!; - - public virtual UserAccount UserAccount { get; set; } = null!; -} diff --git a/DataAccessLayer/UserVerification.cs b/DataAccessLayer/UserVerification.cs deleted file mode 100644 index c4d7105..0000000 --- a/DataAccessLayer/UserVerification.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace DataAccessLayer; - -public partial class UserVerification -{ - public Guid UserVerificationID { get; set; } - - public Guid UserAccountID { get; set; } - - public DateTime VerificationDateTime { get; set; } - - public virtual UserAccount UserAccount { get; set; } = null!; -} diff --git a/biergarten.sln b/biergarten.sln index 869e9ba..6cb0770 100644 --- a/biergarten.sln +++ b/biergarten.sln @@ -7,6 +7,12 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DataAccessLayer", "DataAcce EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DataAccessLayer-Tests", "DataAccessLayer-Tests\DataAccessLayer-Tests.csproj", "{3638DC4E-D4C8-4DBE-CF3B-EF2C805509CE}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{8EC462FD-D22E-90A8-E5CE-7E832BA40C5D}" + ProjectSection(SolutionItems) = preProject + schema.sql = schema.sql + test-data.sql = test-data.sql + EndProjectSection +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU diff --git a/schema.sql b/schema.sql index eab8f62..64a35fc 100644 --- a/schema.sql +++ b/schema.sql @@ -41,6 +41,8 @@ CREATE TABLE UserAccount DateOfBirth DATETIME NOT NULL, + Timer ROWVERSION, + CONSTRAINT PK_UserAccount PRIMARY KEY (UserAccountID), @@ -51,27 +53,6 @@ CREATE TABLE UserAccount UNIQUE (Email), ); ----------------------------------------------------------------------------- ----------------------------------------------------------------------------- -CREATE TABLE Comment -( - CommentID UNIQUEIDENTIFIER - CONSTRAINT DF_CommentID DEFAULT NEWID(), - - CommentText NVARCHAR(512), - - PostedByID UNIQUEIDENTIFIER NOT NULL, - - CONSTRAINT PK_CommentID - PRIMARY KEY (CommentID), - - CONSTRAINT FK_PostedByID - FOREIGN KEY (PostedByID) REFERENCES UserAccount(UserAccountID), -) - -CREATE NONCLUSTERED INDEX IX_Comment_PostedByID -ON Comment(PostedByID); - ---------------------------------------------------------------------------- ---------------------------------------------------------------------------- @@ -88,6 +69,8 @@ CREATE TABLE Photo -- All photos must be linked to a user account, you cannot de UploadedAt DATETIME NOT NULL CONSTRAINT DF_Photo_UploadedAt DEFAULT GETDATE(), + Timer ROWVERSION, + CONSTRAINT PK_Photo PRIMARY KEY (PhotoID), @@ -112,6 +95,8 @@ CREATE TABLE UserAvatar -- delete avatar photo when user account is deleted PhotoID UNIQUEIDENTIFIER NOT NULL, + Timer ROWVERSION, + CONSTRAINT PK_UserAvatar PRIMARY KEY (UserAvatarID), CONSTRAINT FK_UserAvatar_UserAccount @@ -144,6 +129,8 @@ CREATE TABLE UserVerification -- delete verification data when user account is d CONSTRAINT DF_VerificationDateTime DEFAULT GETDATE(), + Timer ROWVERSION, + CONSTRAINT PK_UserVerification PRIMARY KEY (UserVerificationID), @@ -178,6 +165,8 @@ CREATE TABLE UserCredential -- delete credentials when user account is deleted Hash NVARCHAR(100) NOT NULL, -- uses argon2 + Timer ROWVERSION, + CONSTRAINT PK_UserCredential PRIMARY KEY (UserCredentialID), @@ -208,6 +197,8 @@ CREATE TABLE UserFollow CreatedAt DATETIME CONSTRAINT DF_UserFollow_CreatedAt DEFAULT GETDATE() NOT NULL, + Timer ROWVERSION, + CONSTRAINT PK_UserFollow PRIMARY KEY (UserFollowID), @@ -229,6 +220,67 @@ CREATE NONCLUSTERED INDEX IX_UserFollow_UserAccount_FollowingID CREATE NONCLUSTERED INDEX IX_UserFollow_FollowingID_UserAccount ON UserFollow(FollowingID, UserAccountID); + +---------------------------------------------------------------------------- +---------------------------------------------------------------------------- + +CREATE TABLE Country +( + CountryID UNIQUEIDENTIFIER + CONSTRAINT DF_CountryID DEFAULT NEWID(), + + CountryName NVARCHAR(100) NOT NULL, + + CountryCode CHAR(3) NOT NULL, + + Timer ROWVERSION, + + CONSTRAINT PK_Country + PRIMARY KEY (CountryID), +); + +---------------------------------------------------------------------------- +---------------------------------------------------------------------------- + +CREATE TABLE StateProvince +( + StateProvinceID UNIQUEIDENTIFIER + CONSTRAINT DF_StateProvinceID DEFAULT NEWID(), + + StateProvinceName NVARCHAR(100) NOT NULL, + + CountryID UNIQUEIDENTIFIER NOT NULL, + + Timer ROWVERSION, + + CONSTRAINT PK_StateProvince + PRIMARY KEY (StateProvinceID), + + CONSTRAINT FK_StateProvince_Country + FOREIGN KEY (CountryID) + REFERENCES Country(CountryID) +); + + +---------------------------------------------------------------------------- +---------------------------------------------------------------------------- + +CREATE TABLE City +( + CityID UNIQUEIDENTIFIER + CONSTRAINT DF_CityID DEFAULT NEWID(), + + CityName NVARCHAR(100) NOT NULL, + + StateProvinceID UNIQUEIDENTIFIER NOT NULL, + + Timer ROWVERSION, + + CONSTRAINT PK_City + PRIMARY KEY (CityID), +); + + ---------------------------------------------------------------------------- ---------------------------------------------------------------------------- @@ -246,6 +298,12 @@ CREATE TABLE BreweryPost -- A user cannot be deleted if they have a post UpdatedAt DATETIME NULL, + Timer ROWVERSION, + + CityID UNIQUEIDENTIFIER NOT NULL, + + Coordinates GEOGRAPHY NOT NULL, + CONSTRAINT PK_BreweryPost PRIMARY KEY (BreweryPostID), @@ -258,9 +316,9 @@ CREATE TABLE BreweryPost -- A user cannot be deleted if they have a post CREATE NONCLUSTERED INDEX IX_BreweryPost_PostedByID ON BreweryPost(PostedByID); ----------------------------------------------------------------------------- ----------------------------------------------------------------------------- +--------------------------------------------------------------------------- +---------------------------------------------------------------------------- CREATE TABLE BreweryPostPhoto -- All photos linked to a post are deleted if the post is deleted ( BreweryPostPhotoID UNIQUEIDENTIFIER @@ -273,6 +331,8 @@ CREATE TABLE BreweryPostPhoto -- All photos linked to a post are deleted if the LinkedAt DATETIME NOT NULL CONSTRAINT DF_BreweryPostPhoto_LinkedAt DEFAULT GETDATE(), + Timer ROWVERSION, + CONSTRAINT PK_BreweryPostPhoto PRIMARY KEY (BreweryPostPhotoID), @@ -304,6 +364,8 @@ CREATE TABLE BeerStyle Description NVARCHAR(MAX), + Timer ROWVERSION, + CONSTRAINT PK_BeerStyle PRIMARY KEY (BeerStyleID), @@ -340,6 +402,8 @@ CREATE TABLE BeerPost UpdatedAt DATETIME, + Timer ROWVERSION, + CONSTRAINT PK_BeerPost PRIMARY KEY (BeerPostID), @@ -386,6 +450,8 @@ CREATE TABLE BeerPostPhoto -- All photos linked to a beer post are deleted if th LinkedAt DATETIME NOT NULL CONSTRAINT DF_BeerPostPhoto_LinkedAt DEFAULT GETDATE(), + Timer ROWVERSION, + CONSTRAINT PK_BeerPostPhoto PRIMARY KEY (BeerPostPhotoID), @@ -409,10 +475,36 @@ ON BeerPostPhoto(BeerPostID, PhotoID); ---------------------------------------------------------------------------- ---------------------------------------------------------------------------- +CREATE TABLE BeerPostComment +( + BeerPostCommentID UNIQUEIDENTIFIER + CONSTRAINT DF_BeerPostComment DEFAULT NEWID(), + + Comment NVARCHAR(250) NOT NULL, + + BeerPostID UNIQUEIDENTIFIER NOT NULL, + + Rating INT NOT NULL, + + Timer ROWVERSION, + + CONSTRAINT PK_BeerPostComment + PRIMARY KEY (BeerPostCommentID), + + CONSTRAINT FK_BeerPostComment_BeerPost + FOREIGN KEY (BeerPostID) REFERENCES BeerPost(BeerPostID) +) + +CREATE NONCLUSTERED INDEX IX_BeerPostComment_BeerPost + ON BeerPostComment(BeerPostID) + +----------------------------------------------------------------------------- +----------------------------------------------------------------------------- + /* -Install-Package Microsoft.EntityFrameworkCore.SqlServer -Install-Package Microsoft.EntityFrameworkCore.Tools +dotnet add package Microsoft.EntityFrameworkCore.SqlServer +dotnet add package Microsoft.EntityFrameworkCore.Tools -Scaffold-DbContext "Server=(localdb)\ProjectModels;Database=Biergarten;Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer -Context BiergartenContext -UseDatabaseNames -Force +Scaffold-DbContext "Data Source=AARONPC\INFO5052;Integrated Security=True;Persist Security Info=False;Pooling=False;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=True;Database=Biergarten" Microsoft.EntityFrameworkCore.SqlServer -Context BiergartenContext -ContextDir "." -OutputDir "Entities" -UseDatabaseNames -Force */ diff --git a/test-data.sql b/test-data.sql index 1942bde..bbaa1ea 100644 --- a/test-data.sql +++ b/test-data.sql @@ -1,7 +1,6 @@ USE Biergarten; --- User Account Variables (30 users) DECLARE @user1 UNIQUEIDENTIFIER = NEWID(), @user2 UNIQUEIDENTIFIER = NEWID(), @@ -34,7 +33,6 @@ DECLARE @user29 UNIQUEIDENTIFIER = NEWID(), @user30 UNIQUEIDENTIFIER = NEWID(), --- BeerStyle Variables (13 styles) @ipa UNIQUEIDENTIFIER = NEWID(), @stout UNIQUEIDENTIFIER = NEWID(), @lager UNIQUEIDENTIFIER = NEWID(), @@ -49,7 +47,6 @@ DECLARE @brown UNIQUEIDENTIFIER = NEWID(), @barleywine UNIQUEIDENTIFIER = NEWID(), --- Photo Variables (40 photos) @photo1 UNIQUEIDENTIFIER = NEWID(), @photo2 UNIQUEIDENTIFIER = NEWID(), @photo3 UNIQUEIDENTIFIER = NEWID(), @@ -91,7 +88,6 @@ DECLARE @photo39 UNIQUEIDENTIFIER = NEWID(), @photo40 UNIQUEIDENTIFIER = NEWID(), --- BreweryPost Variables (15 breweries) @brewery1 UNIQUEIDENTIFIER = NEWID(), @brewery2 UNIQUEIDENTIFIER = NEWID(), @brewery3 UNIQUEIDENTIFIER = NEWID(), @@ -108,7 +104,6 @@ DECLARE @brewery14 UNIQUEIDENTIFIER = NEWID(), @brewery15 UNIQUEIDENTIFIER = NEWID(), --- BeerPost Variables (28 beers) @beer1 UNIQUEIDENTIFIER = NEWID(), @beer2 UNIQUEIDENTIFIER = NEWID(), @beer3 UNIQUEIDENTIFIER = NEWID(), @@ -138,57 +133,39 @@ DECLARE @beer27 UNIQUEIDENTIFIER = NEWID(), @beer28 UNIQUEIDENTIFIER = NEWID(), --- Rating Variables (50 ratings) -@rating1 UNIQUEIDENTIFIER = NEWID(), -@rating2 UNIQUEIDENTIFIER = NEWID(), -@rating3 UNIQUEIDENTIFIER = NEWID(), -@rating4 UNIQUEIDENTIFIER = NEWID(), -@rating5 UNIQUEIDENTIFIER = NEWID(), -@rating6 UNIQUEIDENTIFIER = NEWID(), -@rating7 UNIQUEIDENTIFIER = NEWID(), -@rating8 UNIQUEIDENTIFIER = NEWID(), -@rating9 UNIQUEIDENTIFIER = NEWID(), -@rating10 UNIQUEIDENTIFIER = NEWID(), -@rating11 UNIQUEIDENTIFIER = NEWID(), -@rating12 UNIQUEIDENTIFIER = NEWID(), -@rating13 UNIQUEIDENTIFIER = NEWID(), -@rating14 UNIQUEIDENTIFIER = NEWID(), -@rating15 UNIQUEIDENTIFIER = NEWID(), -@rating16 UNIQUEIDENTIFIER = NEWID(), -@rating17 UNIQUEIDENTIFIER = NEWID(), -@rating18 UNIQUEIDENTIFIER = NEWID(), -@rating19 UNIQUEIDENTIFIER = NEWID(), -@rating20 UNIQUEIDENTIFIER = NEWID(), -@rating21 UNIQUEIDENTIFIER = NEWID(), -@rating22 UNIQUEIDENTIFIER = NEWID(), -@rating23 UNIQUEIDENTIFIER = NEWID(), -@rating24 UNIQUEIDENTIFIER = NEWID(), -@rating25 UNIQUEIDENTIFIER = NEWID(), -@rating26 UNIQUEIDENTIFIER = NEWID(), -@rating27 UNIQUEIDENTIFIER = NEWID(), -@rating28 UNIQUEIDENTIFIER = NEWID(), -@rating29 UNIQUEIDENTIFIER = NEWID(), -@rating30 UNIQUEIDENTIFIER = NEWID(), -@rating31 UNIQUEIDENTIFIER = NEWID(), -@rating32 UNIQUEIDENTIFIER = NEWID(), -@rating33 UNIQUEIDENTIFIER = NEWID(), -@rating34 UNIQUEIDENTIFIER = NEWID(), -@rating35 UNIQUEIDENTIFIER = NEWID(), -@rating36 UNIQUEIDENTIFIER = NEWID(), -@rating37 UNIQUEIDENTIFIER = NEWID(), -@rating38 UNIQUEIDENTIFIER = NEWID(), -@rating39 UNIQUEIDENTIFIER = NEWID(), -@rating40 UNIQUEIDENTIFIER = NEWID(), -@rating41 UNIQUEIDENTIFIER = NEWID(), -@rating42 UNIQUEIDENTIFIER = NEWID(), -@rating43 UNIQUEIDENTIFIER = NEWID(), -@rating44 UNIQUEIDENTIFIER = NEWID(), -@rating45 UNIQUEIDENTIFIER = NEWID(), -@rating46 UNIQUEIDENTIFIER = NEWID(), -@rating47 UNIQUEIDENTIFIER = NEWID(), -@rating48 UNIQUEIDENTIFIER = NEWID(), -@rating49 UNIQUEIDENTIFIER = NEWID(), -@rating50 UNIQUEIDENTIFIER = NEWID(); +@countryUSA UNIQUEIDENTIFIER = NEWID(), + +@stateOregon UNIQUEIDENTIFIER = NEWID(), +@stateMichigan UNIQUEIDENTIFIER = NEWID(), +@stateCalifornia UNIQUEIDENTIFIER = NEWID(), +@stateColorado UNIQUEIDENTIFIER = NEWID(), +@stateWashington UNIQUEIDENTIFIER = NEWID(), +@stateIllinois UNIQUEIDENTIFIER = NEWID(), +@stateNewYork UNIQUEIDENTIFIER = NEWID(), +@stateTexas UNIQUEIDENTIFIER = NEWID(), +@stateMassachusetts UNIQUEIDENTIFIER = NEWID(), +@statePennsylvania UNIQUEIDENTIFIER = NEWID(), +@stateNorthCarolina UNIQUEIDENTIFIER = NEWID(), +@stateGeorgia UNIQUEIDENTIFIER = NEWID(), +@stateOhio UNIQUEIDENTIFIER = NEWID(), +@stateMissouri UNIQUEIDENTIFIER = NEWID(), +@stateVirginia UNIQUEIDENTIFIER = NEWID(), + +@cityPortland UNIQUEIDENTIFIER = NEWID(), +@cityGrandRapids UNIQUEIDENTIFIER = NEWID(), +@citySanFrancisco UNIQUEIDENTIFIER = NEWID(), +@cityDenver UNIQUEIDENTIFIER = NEWID(), +@citySeattle UNIQUEIDENTIFIER = NEWID(), +@cityChicago UNIQUEIDENTIFIER = NEWID(), +@cityBrooklyn UNIQUEIDENTIFIER = NEWID(), +@cityAustin UNIQUEIDENTIFIER = NEWID(), +@cityBoston UNIQUEIDENTIFIER = NEWID(), +@cityPhiladelphia UNIQUEIDENTIFIER = NEWID(), +@cityAsheville UNIQUEIDENTIFIER = NEWID(), +@cityAtlanta UNIQUEIDENTIFIER = NEWID(), +@cityColumbus UNIQUEIDENTIFIER = NEWID(), +@cityKansasCity UNIQUEIDENTIFIER = NEWID(), +@cityRichmond UNIQUEIDENTIFIER = NEWID(); ---------------------------------------------------------------------------- -- UserAccount (30 users) @@ -252,7 +229,6 @@ VALUES (@barleywine, 'Barleywine', 'Strong ale with intense malt flavors and high alcohol content.'); COMMIT TRANSACTION; - ---------------------------------------------------------------------------- -- UserCredential (28 credentials) ---------------------------------------------------------------------------- @@ -439,28 +415,88 @@ VALUES COMMIT TRANSACTION; +-- Country (1 country) +---------------------------------------------------------------------------- +BEGIN TRANSACTION; +INSERT INTO dbo.Country + (CountryID, CountryName, CountryCode) +VALUES + (@countryUSA, 'United States', 'USA'); +COMMIT TRANSACTION; + + +---------------------------------------------------------------------------- +-- StateProvince (15 states/provinces) +---------------------------------------------------------------------------- +BEGIN TRANSACTION; +INSERT INTO dbo.StateProvince + (StateProvinceID, StateProvinceName, CountryID) +VALUES + (@stateOregon, 'Oregon', @countryUSA), + (@stateMichigan, 'Michigan', @countryUSA), + (@stateCalifornia, 'California', @countryUSA), + (@stateColorado, 'Colorado', @countryUSA), + (@stateWashington, 'Washington', @countryUSA), + (@stateIllinois, 'Illinois', @countryUSA), + (@stateNewYork, 'New York', @countryUSA), + (@stateTexas, 'Texas', @countryUSA), + (@stateMassachusetts, 'Massachusetts', @countryUSA), + (@statePennsylvania, 'Pennsylvania', @countryUSA), + (@stateNorthCarolina, 'North Carolina', @countryUSA), + (@stateGeorgia, 'Georgia', @countryUSA), + (@stateOhio, 'Ohio', @countryUSA), + (@stateMissouri, 'Missouri', @countryUSA), + (@stateVirginia, 'Virginia', @countryUSA); +COMMIT TRANSACTION; + + +---------------------------------------------------------------------------- +-- City (15 cities) +---------------------------------------------------------------------------- +BEGIN TRANSACTION; +INSERT INTO dbo.City + (CityID, CityName, StateProvinceID) +VALUES + (@cityPortland, 'Portland', @stateOregon), + (@cityGrandRapids, 'Grand Rapids', @stateMichigan), + (@citySanFrancisco, 'San Francisco', @stateCalifornia), + (@cityDenver, 'Denver', @stateColorado), + (@citySeattle, 'Seattle', @stateWashington), + (@cityChicago, 'Chicago', @stateIllinois), + (@cityBrooklyn, 'Brooklyn', @stateNewYork), + (@cityAustin, 'Austin', @stateTexas), + (@cityBoston, 'Boston', @stateMassachusetts), + (@cityPhiladelphia, 'Philadelphia', @statePennsylvania), + (@cityAsheville, 'Asheville', @stateNorthCarolina), + (@cityAtlanta, 'Atlanta', @stateGeorgia), + (@cityColumbus, 'Columbus', @stateOhio), + (@cityKansasCity, 'Kansas City', @stateMissouri), + (@cityRichmond, 'Richmond', @stateVirginia); +COMMIT TRANSACTION; + + ---------------------------------------------------------------------------- -- BreweryPost (15 breweries) ---------------------------------------------------------------------------- BEGIN TRANSACTION; INSERT INTO dbo.BreweryPost - (BreweryPostID, PostedByID, Description, CreatedAt) + (BreweryPostID, PostedByID, Description, CreatedAt, UpdatedAt, CityID, Coordinates) VALUES - (@brewery1, @user1, 'Hoppy Trails Brewery - Crafting exceptional IPAs since 2020. Located in the heart of Portland.', '2023-02-01'), - (@brewery2, @user2, 'Dark Horse Brewing Co. - Specializing in rich stouts and porters. Family owned and operated.', '2023-03-01'), - (@brewery3, @user3, 'Golden Gate Lager House - Traditional German-style lagers brewed with precision.', '2023-04-01'), - (@brewery4, @user5, 'Mountain View Ales - High-altitude brewing for unique flavor profiles.', '2023-05-15'), - (@brewery5, @user6, 'Coastal Wheat Works - Refreshing wheat beers perfect for any season.', '2023-06-20'), - (@brewery6, @user9, 'Riverside Porter Factory - Classic porters with a modern twist.', '2023-08-10'), - (@brewery7, @user11, 'Sunset Sour Cellars - Experimental sour ales aged in oak barrels.', '2024-01-20'), - (@brewery8, @user14, 'Urban Craft Collective - Community-focused brewery with rotating seasonal offerings.', '2024-05-10'), - (@brewery9, @user4, 'Belgian House - Authentic Belgian brewing traditions in the heart of the city.', '2024-06-01'), - (@brewery10, @user18, 'Amber Fields Brewery - Celebrating the richness of amber ales and maltier styles.', '2024-08-15'), - (@brewery11, @user20, 'Farmhouse Funk - Specializing in saisons and wild fermented ales.', '2024-09-20'), - (@brewery12, @user24, 'Brown Bear Brewing - Cozy taproom featuring award-winning brown ales.', '2025-01-10'), - (@brewery13, @user27, 'Vintage Vats - Small-batch barleywines and aged strong ales.', '2025-02-25'), - (@brewery14, @user12, 'Hop Haven - Experimental IPAs and cutting-edge hop varieties.', '2024-10-05'), - (@brewery15, @user8, 'Barrel & Grain - Farm-to-glass brewery using locally sourced ingredients.', '2024-04-20'); + (@brewery1, @user1, 'Hoppy Trails Brewery - Crafting exceptional IPAs since 2020. Located in the heart of Portland.', '2023-02-01', NULL, @cityPortland, GEOGRAPHY::Point(45.5152, -122.6784, 4326)), + (@brewery2, @user2, 'Dark Horse Brewing Co. - Specializing in rich stouts and porters. Family owned and operated.', '2023-03-01', NULL, @cityGrandRapids, GEOGRAPHY::Point(42.9634, -85.6681, 4326)), + (@brewery3, @user3, 'Golden Gate Lager House - Traditional German-style lagers brewed with precision.', '2023-04-01', NULL, @citySanFrancisco, GEOGRAPHY::Point(37.7749, -122.4194, 4326)), + (@brewery4, @user5, 'Mountain View Ales - High-altitude brewing for unique flavor profiles.', '2023-05-15', NULL, @cityDenver, GEOGRAPHY::Point(39.7392, -104.9903, 4326)), + (@brewery5, @user6, 'Coastal Wheat Works - Refreshing wheat beers perfect for any season.', '2023-06-20', NULL, @citySeattle, GEOGRAPHY::Point(47.6062, -122.3321, 4326)), + (@brewery6, @user9, 'Riverside Porter Factory - Classic porters with a modern twist.', '2023-08-10', NULL, @cityChicago, GEOGRAPHY::Point(41.8781, -87.6298, 4326)), + (@brewery7, @user11, 'Sunset Sour Cellars - Experimental sour ales aged in oak barrels.', '2024-01-20', '2024-08-12', @cityBrooklyn, GEOGRAPHY::Point(40.6782, -73.9442, 4326)), + (@brewery8, @user14, 'Urban Craft Collective - Community-focused brewery with rotating seasonal offerings.', '2024-05-10', NULL, @cityAustin, GEOGRAPHY::Point(30.2672, -97.7431, 4326)), + (@brewery9, @user4, 'Belgian House - Authentic Belgian brewing traditions in the heart of the city.', '2024-06-01', NULL, @cityBoston, GEOGRAPHY::Point(42.3601, -71.0589, 4326)), + (@brewery10, @user18, 'Amber Fields Brewery - Celebrating the richness of amber ales and maltier styles.', '2024-08-15', NULL, @cityPhiladelphia, GEOGRAPHY::Point(39.9526, -75.1652, 4326)), + (@brewery11, @user20, 'Farmhouse Funk - Specializing in saisons and wild fermented ales.', '2024-09-20', NULL, @cityAsheville, GEOGRAPHY::Point(35.5951, -82.5515, 4326)), + (@brewery12, @user24, 'Brown Bear Brewing - Cozy taproom featuring award-winning brown ales.', '2025-01-10', NULL, @cityAtlanta, GEOGRAPHY::Point(33.7490, -84.3880, 4326)), + (@brewery13, @user27, 'Vintage Vats - Small-batch barleywines and aged strong ales.', '2025-02-25', NULL, @cityColumbus, GEOGRAPHY::Point(39.9612, -82.9988, 4326)), + (@brewery14, @user12, 'Hop Haven - Experimental IPAs and cutting-edge hop varieties.', '2024-10-05', NULL, @cityKansasCity, GEOGRAPHY::Point(39.0997, -94.5786, 4326)), + (@brewery15, @user8, 'Barrel & Grain - Farm-to-glass brewery using locally sourced ingredients.', '2024-04-20', NULL, @cityRichmond, GEOGRAPHY::Point(37.5407, -77.4360, 4326)); COMMIT TRANSACTION; @@ -553,134 +589,6 @@ VALUES COMMIT TRANSACTION; ----------------------------------------------------------------------------- --- Rating (50 ratings) ----------------------------------------------------------------------------- -BEGIN TRANSACTION; -INSERT INTO dbo.Rating - (RatingID, Score, RatedByID) -VALUES - (@rating1, 5, @user2), - (@rating2, 4, @user3), - (@rating3, 5, @user4), - (@rating4, 3, @user5), - (@rating5, 4, @user6), - (@rating6, 5, @user7), - (@rating7, 4, @user8), - (@rating8, 5, @user9), - (@rating9, 3, @user10), - (@rating10, 4, @user11), - (@rating11, 5, @user12), - (@rating12, 4, @user13), - (@rating13, 5, @user14), - (@rating14, 3, @user15), - (@rating15, 4, @user16), - (@rating16, 5, @user17), - (@rating17, 4, @user18), - (@rating18, 5, @user19), - (@rating19, 3, @user20), - (@rating20, 4, @user21), - (@rating21, 5, @user22), - (@rating22, 4, @user23), - (@rating23, 5, @user24), - (@rating24, 3, @user25), - (@rating25, 4, @user26), - (@rating26, 5, @user27), - (@rating27, 4, @user28), - (@rating28, 5, @user29), - (@rating29, 3, @user30), - (@rating30, 4, @user1), - (@rating31, 5, @user3), - (@rating32, 4, @user4), - (@rating33, 5, @user6), - (@rating34, 3, @user8), - (@rating35, 4, @user9), - (@rating36, 5, @user10), - (@rating37, 4, @user11), - (@rating38, 5, @user13), - (@rating39, 3, @user14), - (@rating40, 4, @user15), - (@rating41, 5, @user16), - (@rating42, 4, @user17), - (@rating43, 5, @user18), - (@rating44, 3, @user19), - (@rating45, 4, @user20), - (@rating46, 5, @user21), - (@rating47, 4, @user22), - (@rating48, 5, @user23), - (@rating49, 3, @user24), - (@rating50, 4, @user25); -COMMIT TRANSACTION; - - ----------------------------------------------------------------------------- --- BeerPostComment (30 beer comments) ----------------------------------------------------------------------------- -BEGIN TRANSACTION; -INSERT INTO dbo.BeerPostComment - (CommentText, PostedByID, RatingID) -VALUES - ('This IPA is absolutely fantastic! Perfect balance of hops and malt.', @user2, @rating1), - ('Love the citrus notes in this beer. Will definitely buy again!', @user3, @rating2), - ('Rich and smooth stout. The chocolate flavor is amazing.', @user4, @rating3), - ('Good lager, very refreshing on a hot day.', @user5, @rating4), - ('Nice pale ale, but could use a bit more hop character.', @user6, @rating5), - ('Best wheat beer I''ve had in a while!', @user7, @rating6), - ('Solid porter with great roasted malt flavor.', @user8, @rating7), - ('This sour ale is perfectly tart and refreshing.', @user9, @rating8), - ('Decent pilsner, nothing special but drinkable.', @user10, @rating9), - ('The double IPA lives up to its name - super hoppy!', @user11, @rating10), - ('Vanilla porter is a unique and delicious combination.', @user12, @rating11), - ('Classic hefeweizen with authentic Bavarian character.', @user13, @rating12), - ('Belgian Bliss is truly blissful! Amazing complexity.', @user22, @rating21), - ('Copper Crown has the perfect amber color and taste.', @user23, @rating22), - ('This saison is incredibly refreshing and unique.', @user24, @rating23), - ('Barleywine is a bit too strong for my taste.', @user25, @rating24), - ('Love the citrus bomb! Perfect for IPA lovers.', @user26, @rating25), - ('Mosaic Dream lives up to its name - dreamy!', @user27, @rating26), - ('Farm fresh lager is exactly that - fresh and clean.', @user28, @rating27), - ('Midnight Express gives me the perfect coffee kick.', @user29, @rating28), - ('Harvest wheat is okay, but I prefer traditional wheats.', @user30, @rating29), - ('Cherry sunset sour is perfectly balanced.', @user1, @rating30), - ('Pacific Pale Ale brings back West Coast memories.', @user3, @rating31), - ('Bohemian Pilsner is as authentic as it gets.', @user4, @rating32), - ('Coffee porter is my new favorite breakfast beer!', @user6, @rating33), - ('Wild ferment is interesting but not for everyone.', @user8, @rating34), - ('Session IPA is perfect for summer afternoons.', @user9, @rating35), - ('Nutty brown ale has incredible depth of flavor.', @user10, @rating36), - ('Old Guardian is a masterpiece of brewing.', @user11, @rating37), - ('Imperial Stout deserves all the awards.', @user13, @rating38); -COMMIT TRANSACTION; - - ----------------------------------------------------------------------------- --- BreweryPostComment (20 brewery comments) ----------------------------------------------------------------------------- -BEGIN TRANSACTION; -INSERT INTO dbo.BreweryPostComment - (CommentText, PostedByID, RatingID) -VALUES - ('Amazing brewery! The taproom has a great atmosphere.', @user14, @rating13), - ('Love supporting local breweries like this one.', @user15, @rating14), - ('Good selection of beers, but service could be better.', @user16, @rating15), - ('Best brewery in the area, hands down!', @user17, @rating16), - ('Nice facility and friendly staff. Will visit again.', @user18, @rating17), - ('Great variety of beer styles. Something for everyone.', @user19, @rating18), - ('Decent brewery but a bit pricey.', @user20, @rating19), - ('Fantastic sour beer selection! Worth the trip.', @user21, @rating20), - ('Belgian House has the most authentic Belgian beers outside Belgium!', @user14, @rating39), - ('Amber Fields creates consistently excellent amber ales.', @user15, @rating40), - ('Farmhouse Funk is a must-visit for sour beer enthusiasts.', @user16, @rating41), - ('Brown Bear Brewing has a cozy atmosphere and great beer.', @user17, @rating42), - ('Vintage Vats ages their beers to perfection.', @user18, @rating43), - ('Hop Haven is always pushing boundaries with new hops.', @user19, @rating44), - ('Barrel & Grain sources locally and it shows in quality.', @user20, @rating45), - ('Hoppy Trails never disappoints with their IPAs.', @user21, @rating46), - ('Dark Horse makes the best stouts in the region.', @user22, @rating47), - ('Golden Gate Lager House is my -to for crisp lagers.', @user23, @rating48), - ('Mountain View Ales has incredible views and incredible beer.', @user24, @rating49), - ('Coastal Wheat Works perfects the art of wheat beer.', @user25, @rating50); -COMMIT TRANSACTION; ----------------------------------------------------------------------------