From 2b2df0053feefa2bf443a8a80347a13a273e143a Mon Sep 17 00:00:00 2001 From: Aaron Po Date: Wed, 19 Aug 2026 16:27:55 -0400 Subject: [PATCH] updates --- .../Repository/BreweryRepository.cs | 252 +++++++++++------- 1 file changed, 154 insertions(+), 98 deletions(-) diff --git a/web/backend/Features/Features.Breweries/Repository/BreweryRepository.cs b/web/backend/Features/Features.Breweries/Repository/BreweryRepository.cs index 204d666f..1247f43a 100644 --- a/web/backend/Features/Features.Breweries/Repository/BreweryRepository.cs +++ b/web/backend/Features/Features.Breweries/Repository/BreweryRepository.cs @@ -23,27 +23,27 @@ public class BreweryRepository(ISqlConnectionFactory connectionFactory) IBreweryRepository { private const string SelectColumns = """ - bp.BreweryPostID, - bp.PostedByID, - bp.BreweryName, - bp.Description, - bp.CreatedAt, - bp.UpdatedAt, - bp.RowVersion, - bpl.BreweryPostLocationID, - bpl.CityID, - bpl.AddressLine1, - bpl.AddressLine2, - bpl.PostalCode, - bpl.Coordinates, - c.CityName, - c.StateProvinceID, - sp.StateProvinceName, - sp.ISO3166_2, - sp.CountryID, - co.CountryName, - co.ISO3166_1 - """; + bp.BreweryPostID, + bp.PostedByID, + bp.BreweryName, + bp.Description, + bp.CreatedAt, + bp.UpdatedAt, + bp.RowVersion, + bpl.BreweryPostLocationID, + bpl.CityID, + bpl.AddressLine1, + bpl.AddressLine2, + bpl.PostalCode, + bpl.Coordinates, + c.CityName, + c.StateProvinceID, + sp.StateProvinceName, + sp.ISO3166_2, + sp.CountryID, + co.CountryName, + co.ISO3166_1 + """; /// /// Joins from dbo.BreweryPost down to dbo.Country so a row carries everything needed @@ -52,12 +52,12 @@ public class BreweryRepository(ISqlConnectionFactory connectionFactory) /// behavior), since a brewery post may have no location. /// private const string FromJoins = """ - dbo.BreweryPost bp - LEFT JOIN dbo.BreweryPostLocation bpl ON bp.BreweryPostID = bpl.BreweryPostID - LEFT JOIN dbo.City c ON bpl.CityID = c.CityID - LEFT JOIN dbo.StateProvince sp ON c.StateProvinceID = sp.StateProvinceID - LEFT JOIN dbo.Country co ON sp.CountryID = co.CountryID - """; + dbo.BreweryPost bp + LEFT JOIN dbo.BreweryPostLocation bpl ON bp.BreweryPostID = bpl.BreweryPostID + LEFT JOIN dbo.City c ON bpl.CityID = c.CityID + LEFT JOIN dbo.StateProvince sp ON c.StateProvinceID = sp.StateProvinceID + LEFT JOIN dbo.Country co ON sp.CountryID = co.CountryID + """; /// public async Task GetByIdAsync(Guid id) @@ -65,10 +65,10 @@ public class BreweryRepository(ISqlConnectionFactory connectionFactory) await using DbConnection connection = await CreateConnection(); await using DbCommand command = connection.CreateCommand(); command.CommandText = $""" - SELECT {SelectColumns} - FROM {FromJoins} - WHERE bp.BreweryPostID = @BreweryPostId - """; + SELECT {SelectColumns} + FROM {FromJoins} + WHERE bp.BreweryPostID = @BreweryPostId + """; AddParameter(command, "@BreweryPostId", id); await using DbDataReader reader = await command.ExecuteReaderAsync(); @@ -76,16 +76,17 @@ public class BreweryRepository(ISqlConnectionFactory connectionFactory) } /// - public async Task> GetAllAsync(int? limit, int? offset) + public async Task> GetAllAsync(int? limit, + int? offset) { await using DbConnection connection = await CreateConnection(); await using DbCommand command = connection.CreateCommand(); command.CommandText = $""" - SELECT {SelectColumns} - FROM {FromJoins} - ORDER BY bp.CreatedAt DESC - OFFSET @Offset ROWS FETCH NEXT @Limit ROWS ONLY - """; + SELECT {SelectColumns} + FROM {FromJoins} + ORDER BY bp.CreatedAt DESC + OFFSET @Offset ROWS FETCH NEXT @Limit ROWS ONLY + """; AddParameter(command, "@Offset", offset ?? 0); AddParameter(command, "@Limit", limit ?? int.MaxValue); @@ -102,19 +103,25 @@ public class BreweryRepository(ISqlConnectionFactory connectionFactory) public async Task UpdateAsync(BreweryPost brewery) { await using DbConnection connection = await CreateConnection(); - await using DbTransaction transaction = await connection.BeginTransactionAsync(); + await using DbTransaction transaction = + await connection.BeginTransactionAsync(); try { bool breweryExists = await connection.ExecuteScalarAsync( - new CommandDefinition( - "SELECT 1 FROM dbo.BreweryPost WHERE BreweryPostID = @BreweryPostId", - new { brewery.BreweryPostId }, - transaction + new CommandDefinition( + """ + SELECT 1 FROM + dbo.BreweryPost + WHERE + BreweryPostID = @BreweryPostId + """, + new { brewery.BreweryPostId }, + transaction + ) ) - ) - is not null; + is not null; if (!breweryExists) throw new NotFoundException("Brewery not found."); @@ -123,13 +130,13 @@ public class BreweryRepository(ISqlConnectionFactory connectionFactory) { bool cityExists = await connection.ExecuteScalarAsync( - new CommandDefinition( - "SELECT 1 FROM dbo.City WHERE CityID = @CityId", - new { brewery.Location.CityId }, - transaction + new CommandDefinition( + "SELECT 1 FROM dbo.City WHERE CityID = @CityId", + new { brewery.Location.CityId }, + transaction + ) ) - ) - is not null; + is not null; if (!cityExists) throw new NotFoundException("City not found."); @@ -139,8 +146,12 @@ public class BreweryRepository(ISqlConnectionFactory connectionFactory) new CommandDefinition( """ UPDATE dbo.BreweryPost - SET BreweryName = @BreweryName, Description = @Description, UpdatedAt = GETDATE() - WHERE BreweryPostID = @BreweryPostId AND RowVersion = @RowVersion + SET BreweryName = @BreweryName, + Description = @Description, + UpdatedAt = GETDATE() + WHERE + BreweryPostID = @BreweryPostId + AND RowVersion = @RowVersion """, new { @@ -163,7 +174,11 @@ public class BreweryRepository(ISqlConnectionFactory connectionFactory) // No location supplied: clear any existing location for this brewery. await connection.ExecuteAsync( new CommandDefinition( - "DELETE FROM dbo.BreweryPostLocation WHERE BreweryPostID = @BreweryPostId", + """ + DELETE FROM + dbo.BreweryPostLocation + WHERE BreweryPostID = @BreweryPostId + """, new { brewery.BreweryPostId }, transaction ) @@ -173,21 +188,28 @@ public class BreweryRepository(ISqlConnectionFactory connectionFactory) { bool locationExists = await connection.ExecuteScalarAsync( - new CommandDefinition( - "SELECT 1 FROM dbo.BreweryPostLocation WHERE BreweryPostID = @BreweryPostId", - new { brewery.BreweryPostId }, - transaction + new CommandDefinition( + """ + SELECT 1 + FROM dbo.BreweryPostLocation + WHERE BreweryPostID = @BreweryPostId + """, + new { brewery.BreweryPostId }, + transaction + ) ) - ) - is not null; + is not null; if (locationExists) await connection.ExecuteAsync( new CommandDefinition( """ UPDATE dbo.BreweryPostLocation - SET CityID = @CityId, AddressLine1 = @AddressLine1, AddressLine2 = @AddressLine2, - PostalCode = @PostalCode, Coordinates = @Coordinates + SET CityID = @CityId, + AddressLine1 = @AddressLine1, + AddressLine2 = @AddressLine2, + PostalCode = @PostalCode, + Coordinates = @Coordinates WHERE BreweryPostID = @BreweryPostId """, new @@ -247,9 +269,9 @@ public class BreweryRepository(ISqlConnectionFactory connectionFactory) } return await GetByIdAsync(brewery.BreweryPostId) - ?? throw new InvalidOperationException( - $"Brewery '{brewery.BreweryPostId}' was not found after a successful update." - ); + ?? throw new InvalidOperationException( + $"Brewery '{brewery.BreweryPostId}' was not found after a successful update." + ); } /// @@ -257,7 +279,12 @@ public class BreweryRepository(ISqlConnectionFactory connectionFactory) { await using DbConnection connection = await CreateConnection(); int rows = await connection.ExecuteAsync( - "DELETE FROM dbo.BreweryPost WHERE BreweryPostID = @BreweryPostId", + """ + DELETE FROM + dbo.BreweryPost + WHERE + BreweryPostID = @BreweryPostId + """, new { BreweryPostId = id } ); @@ -269,35 +296,49 @@ public class BreweryRepository(ISqlConnectionFactory connectionFactory) public async Task CreateAsync(BreweryPost brewery) { if (brewery.Location is null) - throw new ArgumentException("Location must be provided when creating a brewery."); + throw new ArgumentException( + "Location must be provided when creating a brewery."); await using DbConnection connection = await CreateConnection(); - await using DbTransaction transaction = await connection.BeginTransactionAsync(); + await using DbTransaction transaction = + await connection.BeginTransactionAsync(); try { bool userExists = await connection.ExecuteScalarAsync( - new CommandDefinition( - "SELECT 1 FROM dbo.UserAccount WHERE UserAccountID = @PostedById", - new { brewery.PostedById }, - transaction + new CommandDefinition( + """ + SELECT 1 + FROM + dbo.UserAccount + WHERE + UserAccountID = @PostedById + """, + new { brewery.PostedById }, + transaction + ) ) - ) - is not null; + is not null; if (!userExists) throw new NotFoundException("User not found."); bool cityExists = await connection.ExecuteScalarAsync( - new CommandDefinition( - "SELECT 1 FROM dbo.City WHERE CityID = @CityId", - new { brewery.Location.CityId }, - transaction + new CommandDefinition( + """ + SELECT 1 + FROM + dbo.City + WHERE + CityID = @CityId + """, + new { brewery.Location.CityId }, + transaction + ) ) - ) - is not null; + is not null; if (!cityExists) throw new NotFoundException("City not found."); @@ -306,15 +347,9 @@ public class BreweryRepository(ISqlConnectionFactory connectionFactory) new CommandDefinition( """ INSERT INTO dbo.BreweryPost - (BreweryPostID, - BreweryName, - Description, - PostedByID) + (BreweryPostID, BreweryName, Description, PostedByID) VALUES - (@BreweryPostId, - @BreweryName, - @Description, - @PostedById) + (@BreweryPostId, @BreweryName, @Description, @PostedById) """, new { @@ -331,8 +366,20 @@ public class BreweryRepository(ISqlConnectionFactory connectionFactory) new CommandDefinition( """ INSERT INTO dbo.BreweryPostLocation - (BreweryPostLocationID, BreweryPostID, CityID, AddressLine1, AddressLine2, PostalCode, Coordinates) - VALUES (@BreweryPostLocationId, @BreweryPostId, @CityId, @AddressLine1, @AddressLine2, @PostalCode, @Coordinates) + (BreweryPostLocationID, + BreweryPostID, + CityID, + AddressLine1, + AddressLine2, + PostalCode, + Coordinates) + VALUES (@BreweryPostLocationId, + @BreweryPostId, + @CityId, + @AddressLine1, + @AddressLine2, + @PostalCode, + @Coordinates) """, new { @@ -378,7 +425,9 @@ public class BreweryRepository(ISqlConnectionFactory connectionFactory) BreweryName = reader.GetString(ordBreweryName), Description = reader.GetString(ordDescription), CreatedAt = reader.GetDateTime(ordCreatedAt), - UpdatedAt = reader.IsDBNull(ordUpdatedAt) ? null : reader.GetDateTime(ordUpdatedAt), + UpdatedAt = reader.IsDBNull(ordUpdatedAt) + ? null + : reader.GetDateTime(ordUpdatedAt), RowVersion = reader.IsDBNull(ordRowVersion) ? null : reader.GetFieldValue(ordRowVersion), @@ -396,7 +445,8 @@ public class BreweryRepository(ISqlConnectionFactory connectionFactory) BreweryPostId = brewery.BreweryPostId, CityId = reader.GetGuid(reader.GetOrdinal("CityId")), City = MapCity(reader), - AddressLine1 = reader.GetString(reader.GetOrdinal("AddressLine1")), + AddressLine1 = + reader.GetString(reader.GetOrdinal("AddressLine1")), AddressLine2 = reader.IsDBNull(ordAddressLine2) ? null : reader.GetString(ordAddressLine2), @@ -421,28 +471,34 @@ public class BreweryRepository(ISqlConnectionFactory connectionFactory) { CityId = reader.GetGuid(reader.GetOrdinal("CityId")), CityName = reader.GetString(reader.GetOrdinal("CityName")), - StateProvinceId = reader.GetGuid(reader.GetOrdinal("StateProvinceId")), + StateProvinceId = + reader.GetGuid(reader.GetOrdinal("StateProvinceId")), StateProvince = new StateProvince { - StateProvinceId = reader.GetGuid(reader.GetOrdinal("StateProvinceId")), - StateProvinceName = reader.GetString(reader.GetOrdinal("StateProvinceName")), + StateProvinceId = + reader.GetGuid(reader.GetOrdinal("StateProvinceId")), + StateProvinceName = + reader.GetString(reader.GetOrdinal("StateProvinceName")), ISO3166_2 = reader.GetString(reader.GetOrdinal("ISO3166_2")), CountryId = reader.GetGuid(reader.GetOrdinal("CountryId")), Country = new Country { CountryId = reader.GetGuid(reader.GetOrdinal("CountryId")), - CountryName = reader.GetString(reader.GetOrdinal("CountryName")), - ISO3166_1 = reader.GetString(reader.GetOrdinal("ISO3166_1")), + CountryName = + reader.GetString(reader.GetOrdinal("CountryName")), + ISO3166_1 = + reader.GetString(reader.GetOrdinal("ISO3166_1")), }, }, }; } - private static void AddParameter(DbCommand command, string name, object? value) + private static void AddParameter(DbCommand command, string name, + object? value) { DbParameter p = command.CreateParameter(); p.ParameterName = name; p.Value = value ?? DBNull.Value; command.Parameters.Add(p); } -} +} \ No newline at end of file