From c2db65d9b1ca5f9d61c4c03072e104c58b250a7f Mon Sep 17 00:00:00 2001 From: Aaron Po Date: Mon, 20 Apr 2026 00:15:39 -0400 Subject: [PATCH 1/3] Add brewery stored procedures, repository and service (#204) * Add create brewery to brewery repository * Implement brewery repo, SQL procs and tests * Implement CRUD operations for Brewery, including service and repository layers * Test updates * DTO updates --- src/Core/API/API.Core/API.Core.csproj | 1 + .../BreweryCreateRequestValidator.cs | 50 ++++++ .../Contracts/Breweries/BreweryDto.cs | 41 +++++ .../API.Core/Controllers/AuthController.cs | 7 + .../API.Core/Controllers/BreweryController.cs | 129 +++++++++++++++ src/Core/API/API.Core/Program.cs | 8 +- src/Core/Core.slnx | 3 +- .../05-Breweries/USP_CreateBrewery.sql | 13 +- .../05-Breweries/USP_GetBreweryById.sql | 9 ++ .../Domain.Entities/Entities/BreweryPost.cs | 13 ++ .../Entities/BreweryPostLocation.cs | 13 ++ .../Infrastructure.Email.csproj | 2 +- .../Auth/AuthRepository.test.cs | 28 +++- .../Breweries/BreweryRepository.test.cs | 108 +++++++++++++ .../Auth/AuthRepository.cs | 41 +++-- .../Breweries/BreweryRepository.cs | 147 ++++++++++++++++++ .../Breweries/IBreweryRepository.cs | 12 ++ .../BreweryService.test.cs | 69 ++++++++ .../Service.Breweries.Tests.csproj | 28 ++++ .../Service.Breweries/BreweryService.cs | 65 ++++++++ .../Service.Breweries/IBreweryService.cs | 64 ++++++++ .../Service.Breweries.csproj | 12 ++ 22 files changed, 839 insertions(+), 24 deletions(-) create mode 100644 src/Core/API/API.Core/Contracts/Breweries/BreweryCreateRequestValidator.cs create mode 100644 src/Core/API/API.Core/Contracts/Breweries/BreweryDto.cs create mode 100644 src/Core/API/API.Core/Controllers/BreweryController.cs create mode 100644 src/Core/Database/Database.Migrations/scripts/03-crud/05-Breweries/USP_GetBreweryById.sql create mode 100644 src/Core/Domain/Domain.Entities/Entities/BreweryPost.cs create mode 100644 src/Core/Domain/Domain.Entities/Entities/BreweryPostLocation.cs create mode 100644 src/Core/Infrastructure/Infrastructure.Repository.Tests/Breweries/BreweryRepository.test.cs create mode 100644 src/Core/Infrastructure/Infrastructure.Repository/Breweries/BreweryRepository.cs create mode 100644 src/Core/Infrastructure/Infrastructure.Repository/Breweries/IBreweryRepository.cs create mode 100644 src/Core/Service/Service.Breweries.Tests/BreweryService.test.cs create mode 100644 src/Core/Service/Service.Breweries.Tests/Service.Breweries.Tests.csproj create mode 100644 src/Core/Service/Service.Breweries/BreweryService.cs create mode 100644 src/Core/Service/Service.Breweries/IBreweryService.cs create mode 100644 src/Core/Service/Service.Breweries/Service.Breweries.csproj diff --git a/src/Core/API/API.Core/API.Core.csproj b/src/Core/API/API.Core/API.Core.csproj index 61c6ba5..aab193e 100644 --- a/src/Core/API/API.Core/API.Core.csproj +++ b/src/Core/API/API.Core/API.Core.csproj @@ -31,6 +31,7 @@ + diff --git a/src/Core/API/API.Core/Contracts/Breweries/BreweryCreateRequestValidator.cs b/src/Core/API/API.Core/Contracts/Breweries/BreweryCreateRequestValidator.cs new file mode 100644 index 0000000..b181a74 --- /dev/null +++ b/src/Core/API/API.Core/Contracts/Breweries/BreweryCreateRequestValidator.cs @@ -0,0 +1,50 @@ +using FluentValidation; + +namespace API.Core.Contracts.Breweries; + +public class BreweryCreateDtoValidator : AbstractValidator +{ + public BreweryCreateDtoValidator() + { + RuleFor(x => x.PostedById) + .NotEmpty() + .WithMessage("PostedById is required."); + + RuleFor(x => x.BreweryName) + .NotEmpty() + .WithMessage("Brewery name is required.") + .MaximumLength(256) + .WithMessage("Brewery name cannot exceed 256 characters."); + + RuleFor(x => x.Description) + .NotEmpty() + .WithMessage("Description is required.") + .MaximumLength(512) + .WithMessage("Description cannot exceed 512 characters."); + + RuleFor(x => x.Location) + .NotNull() + .WithMessage("Location is required."); + + RuleFor(x => x.Location.CityId) + .NotEmpty() + .When(x => x.Location is not null) + .WithMessage("CityId is required."); + + RuleFor(x => x.Location.AddressLine1) + .NotEmpty() + .When(x => x.Location is not null) + .WithMessage("Address line 1 is required.") + .MaximumLength(256) + .When(x => x.Location is not null) + .WithMessage("Address line 1 cannot exceed 256 characters."); + + RuleFor(x => x.Location.PostalCode) + .NotEmpty() + .When(x => x.Location is not null) + .WithMessage("Postal code is required.") + .MaximumLength(20) + .When(x => x.Location is not null) + .WithMessage("Postal code cannot exceed 20 characters."); + } +} diff --git a/src/Core/API/API.Core/Contracts/Breweries/BreweryDto.cs b/src/Core/API/API.Core/Contracts/Breweries/BreweryDto.cs new file mode 100644 index 0000000..c6ff6bf --- /dev/null +++ b/src/Core/API/API.Core/Contracts/Breweries/BreweryDto.cs @@ -0,0 +1,41 @@ +namespace API.Core.Contracts.Breweries; + +public class BreweryLocationCreateDto +{ + public Guid CityId { get; set; } + public string AddressLine1 { get; set; } = string.Empty; + public string? AddressLine2 { get; set; } + public string PostalCode { get; set; } = string.Empty; + public byte[]? Coordinates { get; set; } +} + +public class BreweryLocationDto +{ + public Guid BreweryPostLocationId { get; set; } + public Guid BreweryPostId { get; set; } + public Guid CityId { get; set; } + public string AddressLine1 { get; set; } = string.Empty; + public string? AddressLine2 { get; set; } + public string PostalCode { get; set; } = string.Empty; + public byte[]? Coordinates { get; set; } +} + +public class BreweryCreateDto +{ + public Guid PostedById { get; set; } + public string BreweryName { get; set; } = string.Empty; + public string Description { get; set; } = string.Empty; + public BreweryLocationCreateDto Location { get; set; } = null!; +} + +public class BreweryDto +{ + public Guid BreweryPostId { get; set; } + public Guid PostedById { get; set; } + public string BreweryName { get; set; } = string.Empty; + public string Description { get; set; } = string.Empty; + public DateTime CreatedAt { get; set; } + public DateTime? UpdatedAt { get; set; } + public byte[]? Timer { get; set; } + public BreweryLocationDto? Location { get; set; } +} diff --git a/src/Core/API/API.Core/Controllers/AuthController.cs b/src/Core/API/API.Core/Controllers/AuthController.cs index 7b2dcc4..a6cc9af 100644 --- a/src/Core/API/API.Core/Controllers/AuthController.cs +++ b/src/Core/API/API.Core/Controllers/AuthController.cs @@ -86,6 +86,13 @@ namespace API.Core.Controllers ); } + [HttpPost("confirm/resend")] + public async Task ResendConfirmation([FromQuery] Guid userId) + { + await confirmationService.ResendConfirmationEmailAsync(userId); + return Ok(new ResponseBody { Message = "confirmation email has been resent" }); + } + [AllowAnonymous] [HttpPost("refresh")] public async Task Refresh( diff --git a/src/Core/API/API.Core/Controllers/BreweryController.cs b/src/Core/API/API.Core/Controllers/BreweryController.cs new file mode 100644 index 0000000..d0fb8d4 --- /dev/null +++ b/src/Core/API/API.Core/Controllers/BreweryController.cs @@ -0,0 +1,129 @@ +using API.Core.Contracts.Breweries; +using API.Core.Contracts.Common; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using Service.Breweries; + +namespace API.Core.Controllers; + +[ApiController] +[Route("api/[controller]")] +[Authorize(AuthenticationSchemes = "JWT")] +public class BreweryController(IBreweryService breweryService) : ControllerBase +{ + [AllowAnonymous] + [HttpGet("{id:guid}")] + public async Task>> GetById(Guid id) + { + var brewery = await breweryService.GetByIdAsync(id); + if (brewery is null) + return NotFound(new ResponseBody { Message = $"Brewery with ID {id} not found." }); + + return Ok(new ResponseBody + { + Message = "Brewery retrieved successfully.", + Payload = MapToDto(brewery), + }); + } + + [AllowAnonymous] + [HttpGet] + public async Task>>> GetAll( + [FromQuery] int? limit, + [FromQuery] int? offset) + { + var breweries = await breweryService.GetAllAsync(limit, offset); + return Ok(new ResponseBody> + { + Message = "Breweries retrieved successfully.", + Payload = breweries.Select(MapToDto), + }); + } + + [HttpPost] + public async Task>> Create([FromBody] BreweryCreateDto dto) + { + var request = new BreweryCreateRequest( + dto.PostedById, + dto.BreweryName, + dto.Description, + new BreweryLocationCreateRequest( + dto.Location.CityId, + dto.Location.AddressLine1, + dto.Location.AddressLine2, + dto.Location.PostalCode, + dto.Location.Coordinates + ) + ); + + var result = await breweryService.CreateAsync(request); + if (!result.Success) + return BadRequest(new ResponseBody { Message = result.Message }); + + return Created($"/api/brewery/{result.Brewery.BreweryPostId}", new ResponseBody + { + Message = "Brewery created successfully.", + Payload = MapToDto(result.Brewery), + }); + } + + [HttpPut("{id:guid}")] + public async Task>> Update(Guid id, [FromBody] BreweryDto dto) + { + if (dto.BreweryPostId != id) + return BadRequest(new ResponseBody { Message = "Route ID does not match payload ID." }); + + var request = new BreweryUpdateRequest( + dto.BreweryPostId, + dto.PostedById, + dto.BreweryName, + dto.Description, + dto.Location is null ? null : new BreweryLocationUpdateRequest( + dto.Location.BreweryPostLocationId, + dto.Location.CityId, + dto.Location.AddressLine1, + dto.Location.AddressLine2, + dto.Location.PostalCode, + dto.Location.Coordinates + ) + ); + + var result = await breweryService.UpdateAsync(request); + if (!result.Success) + return BadRequest(new ResponseBody { Message = result.Message }); + + return Ok(new ResponseBody + { + Message = "Brewery updated successfully.", + Payload = MapToDto(result.Brewery), + }); + } + + [HttpDelete("{id:guid}")] + public async Task> Delete(Guid id) + { + await breweryService.DeleteAsync(id); + return Ok(new ResponseBody { Message = "Brewery deleted successfully." }); + } + + private static BreweryDto MapToDto(Domain.Entities.BreweryPost b) => new() + { + BreweryPostId = b.BreweryPostId, + PostedById = b.PostedById, + BreweryName = b.BreweryName, + Description = b.Description, + CreatedAt = b.CreatedAt, + UpdatedAt = b.UpdatedAt, + Timer = b.Timer, + Location = b.Location is null ? null : new BreweryLocationDto + { + BreweryPostLocationId = b.Location.BreweryPostLocationId, + BreweryPostId = b.Location.BreweryPostId, + CityId = b.Location.CityId, + AddressLine1 = b.Location.AddressLine1, + AddressLine2 = b.Location.AddressLine2, + PostalCode = b.Location.PostalCode, + Coordinates = b.Location.Coordinates, + }, + }; +} diff --git a/src/Core/API/API.Core/Program.cs b/src/Core/API/API.Core/Program.cs index e186dba..f6c7aee 100644 --- a/src/Core/API/API.Core/Program.cs +++ b/src/Core/API/API.Core/Program.cs @@ -1,20 +1,15 @@ using API.Core; using API.Core.Authentication; -using API.Core.Contracts.Common; -using Domain.Exceptions; using FluentValidation; using FluentValidation.AspNetCore; using Infrastructure.Email; -using Infrastructure.Email.Templates; using Infrastructure.Email.Templates.Rendering; using Infrastructure.Jwt; using Infrastructure.PasswordHashing; using Infrastructure.Repository.Auth; using Infrastructure.Repository.Sql; using Infrastructure.Repository.UserAccount; -using Microsoft.AspNetCore.Authentication; -using Microsoft.AspNetCore.Mvc; -using Microsoft.AspNetCore.Mvc.Filters; +using Infrastructure.Repository.Breweries; using Service.Auth; using Service.Emails; using Service.UserManagement.User; @@ -55,6 +50,7 @@ builder.Services.AddSingleton< builder.Services.AddScoped(); builder.Services.AddScoped(); +builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); diff --git a/src/Core/Core.slnx b/src/Core/Core.slnx index b1ff5d5..6add115 100644 --- a/src/Core/Core.slnx +++ b/src/Core/Core.slnx @@ -26,6 +26,7 @@ - + + diff --git a/src/Core/Database/Database.Migrations/scripts/03-crud/05-Breweries/USP_CreateBrewery.sql b/src/Core/Database/Database.Migrations/scripts/03-crud/05-Breweries/USP_CreateBrewery.sql index 38cdf51..3683dc7 100644 --- a/src/Core/Database/Database.Migrations/scripts/03-crud/05-Breweries/USP_CreateBrewery.sql +++ b/src/Core/Database/Database.Migrations/scripts/03-crud/05-Breweries/USP_CreateBrewery.sql @@ -12,7 +12,7 @@ AS BEGIN SET NOCOUNT ON; SET XACT_ABORT ON; - + IF @BreweryName IS NULL THROW 50001, 'Brewery name cannot be null.', 1; @@ -30,6 +30,7 @@ BEGIN THROW 50404, 'City not found.', 1; DECLARE @NewBreweryID UNIQUEIDENTIFIER = NEWID(); + DECLARE @NewBrewerLocationID UNIQUEIDENTIFIER = NEWID(); BEGIN TRANSACTION; @@ -37,9 +38,13 @@ BEGIN (BreweryPostID, BreweryName, Description, PostedByID) VALUES (@NewBreweryID, @BreweryName, @Description, @PostedByID); - INSERT INTO dbo.BreweryPostLocation - (@NewBreweryID, CityID, AddressLine1, AddressLine2, PostalCode, Coordinates) - VALUES (@NewBreweryID, @CityID, @AddressLine1, @AddressLine2, @PostalCode, @Coordinates); + INSERT INTO dbo.BreweryPostLocation + (BreweryPostLocationID, BreweryPostID, CityID, AddressLine1, AddressLine2, PostalCode, Coordinates) + VALUES (@NewBrewerLocationID, @NewBreweryID, @CityID, @AddressLine1, @AddressLine2, @PostalCode, @Coordinates); COMMIT TRANSACTION; + + SELECT @NewBreweryID AS BreweryPostID, + @NewBrewerLocationID AS BreweryPostLocationID; + END diff --git a/src/Core/Database/Database.Migrations/scripts/03-crud/05-Breweries/USP_GetBreweryById.sql b/src/Core/Database/Database.Migrations/scripts/03-crud/05-Breweries/USP_GetBreweryById.sql new file mode 100644 index 0000000..25425ef --- /dev/null +++ b/src/Core/Database/Database.Migrations/scripts/03-crud/05-Breweries/USP_GetBreweryById.sql @@ -0,0 +1,9 @@ +CREATE OR ALTER PROCEDURE dbo.USP_GetBreweryById @BreweryPostID UNIQUEIDENTIFIER +AS +BEGIN + SELECT * + FROM BreweryPost bp + INNER JOIN BreweryPostLocation bpl + ON bp.BreweryPostID = bpl.BreweryPostID + WHERE bp.BreweryPostID = @BreweryPostID; +END \ No newline at end of file diff --git a/src/Core/Domain/Domain.Entities/Entities/BreweryPost.cs b/src/Core/Domain/Domain.Entities/Entities/BreweryPost.cs new file mode 100644 index 0000000..07a7b78 --- /dev/null +++ b/src/Core/Domain/Domain.Entities/Entities/BreweryPost.cs @@ -0,0 +1,13 @@ +namespace Domain.Entities; + +public class BreweryPost +{ + public Guid BreweryPostId { get; set; } + public Guid PostedById { get; set; } + public string BreweryName { get; set; } = string.Empty; + public string Description { get; set; } = string.Empty; + public DateTime CreatedAt { get; set; } + public DateTime? UpdatedAt { get; set; } + public byte[]? Timer { get; set; } + public BreweryPostLocation? Location { get; set; } +} diff --git a/src/Core/Domain/Domain.Entities/Entities/BreweryPostLocation.cs b/src/Core/Domain/Domain.Entities/Entities/BreweryPostLocation.cs new file mode 100644 index 0000000..460e30a --- /dev/null +++ b/src/Core/Domain/Domain.Entities/Entities/BreweryPostLocation.cs @@ -0,0 +1,13 @@ +namespace Domain.Entities; + +public class BreweryPostLocation +{ + public Guid BreweryPostLocationId { get; set; } + public Guid BreweryPostId { get; set; } + public string AddressLine1 { get; set; } = string.Empty; + public string? AddressLine2 { get; set; } + public string PostalCode { get; set; } = string.Empty; + public Guid CityId { get; set; } + public byte[]? Coordinates { get; set; } + public byte[]? Timer { get; set; } +} diff --git a/src/Core/Infrastructure/Infrastructure.Email/Infrastructure.Email.csproj b/src/Core/Infrastructure/Infrastructure.Email/Infrastructure.Email.csproj index b02eae8..717486f 100644 --- a/src/Core/Infrastructure/Infrastructure.Email/Infrastructure.Email.csproj +++ b/src/Core/Infrastructure/Infrastructure.Email/Infrastructure.Email.csproj @@ -7,6 +7,6 @@ - + diff --git a/src/Core/Infrastructure/Infrastructure.Repository.Tests/Auth/AuthRepository.test.cs b/src/Core/Infrastructure/Infrastructure.Repository.Tests/Auth/AuthRepository.test.cs index e30ceee..e067b4f 100644 --- a/src/Core/Infrastructure/Infrastructure.Repository.Tests/Auth/AuthRepository.test.cs +++ b/src/Core/Infrastructure/Infrastructure.Repository.Tests/Auth/AuthRepository.test.cs @@ -17,10 +17,34 @@ public class AuthRepositoryTest var conn = new MockDbConnection(); conn.Mocks.When(cmd => cmd.CommandText == "USP_RegisterUser") + .ReturnsScalar(expectedUserId); + + // Mock the subsequent read for the newly created user by id + conn.Mocks.When(cmd => cmd.CommandText == "usp_GetUserAccountById") .ReturnsTable( MockTable - .WithColumns(("UserAccountId", typeof(Guid))) - .AddRow(expectedUserId) + .WithColumns( + ("UserAccountId", typeof(Guid)), + ("Username", typeof(string)), + ("FirstName", typeof(string)), + ("LastName", typeof(string)), + ("Email", typeof(string)), + ("CreatedAt", typeof(DateTime)), + ("UpdatedAt", typeof(DateTime?)), + ("DateOfBirth", typeof(DateTime)), + ("Timer", typeof(byte[])) + ) + .AddRow( + expectedUserId, + "testuser", + "Test", + "User", + "test@example.com", + DateTime.UtcNow, + null, + new DateTime(1990, 1, 1), + null + ) ); var repo = CreateRepo(conn); diff --git a/src/Core/Infrastructure/Infrastructure.Repository.Tests/Breweries/BreweryRepository.test.cs b/src/Core/Infrastructure/Infrastructure.Repository.Tests/Breweries/BreweryRepository.test.cs new file mode 100644 index 0000000..6352124 --- /dev/null +++ b/src/Core/Infrastructure/Infrastructure.Repository.Tests/Breweries/BreweryRepository.test.cs @@ -0,0 +1,108 @@ +using Apps72.Dev.Data.DbMocker; +using FluentAssertions; +using Infrastructure.Repository.Breweries; +using Infrastructure.Repository.Tests.Database; +using Domain.Entities; + +namespace Infrastructure.Repository.Tests.Breweries; + +public class BreweryRepositoryTest +{ + private static BreweryRepository CreateRepo(MockDbConnection conn) => + new(new TestConnectionFactory(conn)); + + [Fact] + public async Task GetByIdAsync_ReturnsBrewery_WhenExists() + { + var breweryId = Guid.NewGuid(); + var conn = new MockDbConnection(); + + // Repository calls the stored procedure + const string getByIdSql = "USP_GetBreweryById"; + + var locationId = Guid.NewGuid(); + + conn.Mocks.When(cmd => cmd.CommandText == getByIdSql) + .ReturnsTable( + MockTable + .WithColumns( + ("BreweryPostId", typeof(Guid)), + ("PostedById", typeof(Guid)), + ("BreweryName", typeof(string)), + ("Description", typeof(string)), + ("CreatedAt", typeof(DateTime)), + ("UpdatedAt", typeof(DateTime?)), + ("Timer", typeof(byte[])), + ("BreweryPostLocationId", typeof(Guid)), + ("CityId", typeof(Guid)), + ("AddressLine1", typeof(string)), + ("AddressLine2", typeof(string)), + ("PostalCode", typeof(string)), + ("Coordinates", typeof(byte[])) + ) + .AddRow( + breweryId, + Guid.NewGuid(), + "Test Brewery", + "A test brewery description", + DateTime.UtcNow, + null, + null, + locationId, + Guid.NewGuid(), + "123 Main St", + null, + "12345", + null + ) + ); + + var repo = CreateRepo(conn); + var result = await repo.GetByIdAsync(breweryId); + result.Should().NotBeNull(); + result!.BreweryPostId.Should().Be(breweryId); + result.Location.Should().NotBeNull(); + result.Location!.BreweryPostLocationId.Should().Be(locationId); + } + + [Fact] + public async Task GetByIdAsync_ReturnsNull_WhenNotExists() + { + var conn = new MockDbConnection(); + conn.Mocks.When(cmd => cmd.CommandText == "USP_GetBreweryById") + .ReturnsTable(MockTable.Empty()); + var repo = CreateRepo(conn); + var result = await repo.GetByIdAsync(Guid.NewGuid()); + result.Should().BeNull(); + + } + + [Fact] + public async Task CreateAsync_ExecutesSuccessfully() + { + var conn = new MockDbConnection(); + conn.Mocks.When(cmd => cmd.CommandText == "USP_CreateBrewery") + .ReturnsScalar(1); + var repo = CreateRepo(conn); + var brewery = new BreweryPost + { + BreweryPostId = Guid.NewGuid(), + PostedById = Guid.NewGuid(), + BreweryName = "Test Brewery", + Description = "A test brewery description", + CreatedAt = DateTime.UtcNow, + Location = new BreweryPostLocation + { + BreweryPostLocationId = Guid.NewGuid(), + CityId = Guid.NewGuid(), + AddressLine1 = "123 Main St", + PostalCode = "12345", + Coordinates = [0x00, 0x01] + } + }; + + // Should not throw + var act = async () => await repo.CreateAsync(brewery); + await act.Should().NotThrowAsync(); + } +} diff --git a/src/Core/Infrastructure/Infrastructure.Repository/Auth/AuthRepository.cs b/src/Core/Infrastructure/Infrastructure.Repository/Auth/AuthRepository.cs index fbff2b3..bb701b3 100644 --- a/src/Core/Infrastructure/Infrastructure.Repository/Auth/AuthRepository.cs +++ b/src/Core/Infrastructure/Infrastructure.Repository/Auth/AuthRepository.cs @@ -33,18 +33,39 @@ public class AuthRepository(ISqlConnectionFactory connectionFactory) AddParameter(command, "@Hash", passwordHash); var result = await command.ExecuteScalarAsync(); - var userAccountId = result != null ? (Guid)result : Guid.Empty; - return new Domain.Entities.UserAccount + Guid userAccountId = Guid.Empty; + if (result != null && result != DBNull.Value) { - UserAccountId = userAccountId, - Username = username, - FirstName = firstName, - LastName = lastName, - Email = email, - DateOfBirth = dateOfBirth, - CreatedAt = DateTime.UtcNow, - }; + if (result is Guid g) + { + userAccountId = g; + } + else if (result is string s && Guid.TryParse(s, out var parsed)) + { + userAccountId = parsed; + } + else if (result is byte[] bytes && bytes.Length == 16) + { + userAccountId = new Guid(bytes); + } + else + { + // Fallback: try to convert and parse string representation + try + { + var str = result.ToString(); + if (!string.IsNullOrEmpty(str) && Guid.TryParse(str, out var p)) + userAccountId = p; + } + catch + { + userAccountId = Guid.Empty; + } + } + } + + return await GetUserByIdAsync(userAccountId) ?? throw new Exception("Failed to retrieve newly registered user."); } public async Task GetUserByEmailAsync( diff --git a/src/Core/Infrastructure/Infrastructure.Repository/Breweries/BreweryRepository.cs b/src/Core/Infrastructure/Infrastructure.Repository/Breweries/BreweryRepository.cs new file mode 100644 index 0000000..08332c4 --- /dev/null +++ b/src/Core/Infrastructure/Infrastructure.Repository/Breweries/BreweryRepository.cs @@ -0,0 +1,147 @@ +using System.Data.Common; +using Domain.Entities; +using Infrastructure.Repository.Sql; + +namespace Infrastructure.Repository.Breweries; + +public class BreweryRepository(ISqlConnectionFactory connectionFactory) + : Repository(connectionFactory), IBreweryRepository +{ + private readonly ISqlConnectionFactory _connectionFactory = connectionFactory; + + public async Task GetByIdAsync(Guid id) + { + await using var connection = await CreateConnection(); + await using var command = connection.CreateCommand(); + command.CommandType = System.Data.CommandType.StoredProcedure; + + command.CommandText = "USP_GetBreweryById"; + AddParameter(command, "@BreweryPostID", id); + + await using var reader = await command.ExecuteReaderAsync(); + if (await reader.ReadAsync()) + { + return MapToEntity(reader); + } + return null; + } + + public Task> GetAllAsync(int? limit, int? offset) + { + throw new NotImplementedException(); + } + + public Task UpdateAsync(BreweryPost brewery) + { + throw new NotImplementedException(); + } + + public Task DeleteAsync(Guid id) + { + throw new NotImplementedException(); + } + + public async Task CreateAsync(BreweryPost brewery) + { + await using var connection = await CreateConnection(); + await using var command = connection.CreateCommand(); + + command.CommandText = "USP_CreateBrewery"; + command.CommandType = System.Data.CommandType.StoredProcedure; + + if (brewery.Location is null) + { + throw new ArgumentException("Location must be provided when creating a brewery."); + } + + AddParameter(command, "@BreweryName", brewery.BreweryName); + AddParameter(command, "@Description", brewery.Description); + AddParameter(command, "@PostedByID", brewery.PostedById); + AddParameter(command, "@CityID", brewery.Location?.CityId); + AddParameter(command, "@AddressLine1", brewery.Location?.AddressLine1); + AddParameter(command, "@AddressLine2", brewery.Location?.AddressLine2); + AddParameter(command, "@PostalCode", brewery.Location?.PostalCode); + AddParameter(command, "@Coordinates", brewery.Location?.Coordinates); + await command.ExecuteNonQueryAsync(); + + } + + protected override BreweryPost MapToEntity(DbDataReader reader) + { + var brewery = new BreweryPost(); + + var ordBreweryPostId = reader.GetOrdinal("BreweryPostId"); + var ordPostedById = reader.GetOrdinal("PostedById"); + var ordBreweryName = reader.GetOrdinal("BreweryName"); + var ordDescription = reader.GetOrdinal("Description"); + var ordCreatedAt = reader.GetOrdinal("CreatedAt"); + var ordUpdatedAt = reader.GetOrdinal("UpdatedAt"); + var ordTimer = reader.GetOrdinal("Timer"); + + brewery.BreweryPostId = reader.GetGuid(ordBreweryPostId); + brewery.PostedById = reader.GetGuid(ordPostedById); + brewery.BreweryName = reader.GetString(ordBreweryName); + brewery.Description = reader.GetString(ordDescription); + brewery.CreatedAt = reader.GetDateTime(ordCreatedAt); + + brewery.UpdatedAt = reader.IsDBNull(ordUpdatedAt) ? null : reader.GetDateTime(ordUpdatedAt); + + // Read timer (varbinary/rowversion) robustly + if (reader.IsDBNull(ordTimer)) + { + brewery.Timer = null; + } + else + { + try + { + brewery.Timer = reader.GetFieldValue(ordTimer); + } + catch + { + var length = reader.GetBytes(ordTimer, 0, null, 0, 0); + var buffer = new byte[length]; + reader.GetBytes(ordTimer, 0, buffer, 0, (int)length); + brewery.Timer = buffer; + } + } + + // Map BreweryPostLocation if columns are present + try + { + var ordLocationId = reader.GetOrdinal("BreweryPostLocationId"); + if (!reader.IsDBNull(ordLocationId)) + { + var location = new BreweryPostLocation + { + BreweryPostLocationId = reader.GetGuid(ordLocationId), + BreweryPostId = reader.GetGuid(reader.GetOrdinal("BreweryPostId")), + CityId = reader.GetGuid(reader.GetOrdinal("CityId")), + AddressLine1 = reader.GetString(reader.GetOrdinal("AddressLine1")), + AddressLine2 = reader.IsDBNull(reader.GetOrdinal("AddressLine2")) ? null : reader.GetString(reader.GetOrdinal("AddressLine2")), + PostalCode = reader.GetString(reader.GetOrdinal("PostalCode")), + Coordinates = reader.IsDBNull(reader.GetOrdinal("Coordinates")) ? null : reader.GetFieldValue(reader.GetOrdinal("Coordinates")) + }; + brewery.Location = location; + } + } + catch (IndexOutOfRangeException) + { + // Location columns not present, skip mapping location + } + + return brewery; + } + + private static void AddParameter( + DbCommand command, + string name, + object? value + ) + { + var p = command.CreateParameter(); + p.ParameterName = name; + p.Value = value ?? DBNull.Value; + command.Parameters.Add(p); + } +} diff --git a/src/Core/Infrastructure/Infrastructure.Repository/Breweries/IBreweryRepository.cs b/src/Core/Infrastructure/Infrastructure.Repository/Breweries/IBreweryRepository.cs new file mode 100644 index 0000000..2d394cb --- /dev/null +++ b/src/Core/Infrastructure/Infrastructure.Repository/Breweries/IBreweryRepository.cs @@ -0,0 +1,12 @@ +using Domain.Entities; + +namespace Infrastructure.Repository.Breweries; + +public interface IBreweryRepository +{ + Task GetByIdAsync(Guid id); + Task> GetAllAsync(int? limit, int? offset); + Task UpdateAsync(BreweryPost brewery); + Task DeleteAsync(Guid id); + Task CreateAsync(BreweryPost brewery); +} \ No newline at end of file diff --git a/src/Core/Service/Service.Breweries.Tests/BreweryService.test.cs b/src/Core/Service/Service.Breweries.Tests/BreweryService.test.cs new file mode 100644 index 0000000..a6b49cb --- /dev/null +++ b/src/Core/Service/Service.Breweries.Tests/BreweryService.test.cs @@ -0,0 +1,69 @@ +using FluentAssertions; +using Xunit; +using Service.Breweries; +using API.Core.Contracts.Breweries; +using Domain.Entities; + +namespace Service.Breweries.Tests; + +public class BreweryServiceTests +{ + private class FakeRepo : IBreweryRepository + { + public BreweryPost? Created; + + public Task GetByIdAsync(Guid id) => Task.FromResult(null); + public Task> GetAllAsync(int? limit, int? offset) => Task.FromResult>(Array.Empty()); + public Task UpdateAsync(BreweryPost brewery) { Created = brewery; return Task.CompletedTask; } + public Task DeleteAsync(Guid id) => Task.CompletedTask; + public Task CreateAsync(BreweryPost brewery) { Created = brewery; return Task.CompletedTask; } + } + + [Fact] + public async Task CreateAsync_ReturnsFailure_WhenLocationMissing() + { + var repo = new FakeRepo(); + var svc = new BreweryService(repo); + + var dto = new BreweryCreateDto + { + PostedById = Guid.NewGuid(), + BreweryName = "X", + Description = "Y", + Location = null! + }; + + var result = await svc.CreateAsync(dto); + result.Success.Should().BeFalse(); + result.Message.Should().Contain("Location"); + } + + [Fact] + public async Task CreateAsync_ReturnsSuccess_AndPersistsEntity() + { + var repo = new FakeRepo(); + var svc = new BreweryService(repo); + + var loc = new BreweryLocationCreateDto + { + CityId = Guid.NewGuid(), + AddressLine1 = "123 Main", + PostalCode = "12345" + }; + + var dto = new BreweryCreateDto + { + PostedById = Guid.NewGuid(), + BreweryName = "MyBrew", + Description = "Desc", + Location = loc + }; + + var result = await svc.CreateAsync(dto); + + result.Success.Should().BeTrue(); + repo.Created.Should().NotBeNull(); + repo.Created!.BreweryName.Should().Be("MyBrew"); + result.Brewery.BreweryName.Should().Be("MyBrew"); + } +} diff --git a/src/Core/Service/Service.Breweries.Tests/Service.Breweries.Tests.csproj b/src/Core/Service/Service.Breweries.Tests/Service.Breweries.Tests.csproj new file mode 100644 index 0000000..bd1c5c8 --- /dev/null +++ b/src/Core/Service/Service.Breweries.Tests/Service.Breweries.Tests.csproj @@ -0,0 +1,28 @@ + + + net10.0 + enable + enable + false + Service.Breweries.Tests + + + + + + + + + + + + + + + + + + + + diff --git a/src/Core/Service/Service.Breweries/BreweryService.cs b/src/Core/Service/Service.Breweries/BreweryService.cs new file mode 100644 index 0000000..5966f6c --- /dev/null +++ b/src/Core/Service/Service.Breweries/BreweryService.cs @@ -0,0 +1,65 @@ +using Domain.Entities; +using Infrastructure.Repository.Breweries; + +namespace Service.Breweries; + +public class BreweryService(IBreweryRepository repository) : IBreweryService +{ + public Task GetByIdAsync(Guid id) => + repository.GetByIdAsync(id); + + public Task> GetAllAsync(int? limit = null, int? offset = null) => + repository.GetAllAsync(limit, offset); + + public async Task CreateAsync(BreweryCreateRequest request) + { + var entity = new BreweryPost + { + BreweryPostId = Guid.NewGuid(), + PostedById = request.PostedById, + BreweryName = request.BreweryName, + Description = request.Description, + CreatedAt = DateTime.UtcNow, + Location = new BreweryPostLocation + { + BreweryPostLocationId = Guid.NewGuid(), + CityId = request.Location.CityId, + AddressLine1 = request.Location.AddressLine1, + AddressLine2 = request.Location.AddressLine2, + PostalCode = request.Location.PostalCode, + Coordinates = request.Location.Coordinates, + }, + }; + + await repository.CreateAsync(entity); + return new BreweryServiceReturn(entity); + } + + public async Task UpdateAsync(BreweryUpdateRequest request) + { + var entity = new BreweryPost + { + BreweryPostId = request.BreweryPostId, + PostedById = request.PostedById, + BreweryName = request.BreweryName, + Description = request.Description, + UpdatedAt = DateTime.UtcNow, + Location = request.Location is null ? null : new BreweryPostLocation + { + BreweryPostLocationId = request.Location.BreweryPostLocationId, + BreweryPostId = request.BreweryPostId, + CityId = request.Location.CityId, + AddressLine1 = request.Location.AddressLine1, + AddressLine2 = request.Location.AddressLine2, + PostalCode = request.Location.PostalCode, + Coordinates = request.Location.Coordinates, + }, + }; + + await repository.UpdateAsync(entity); + return new BreweryServiceReturn(entity); + } + + public Task DeleteAsync(Guid id) => + repository.DeleteAsync(id); +} diff --git a/src/Core/Service/Service.Breweries/IBreweryService.cs b/src/Core/Service/Service.Breweries/IBreweryService.cs new file mode 100644 index 0000000..5331634 --- /dev/null +++ b/src/Core/Service/Service.Breweries/IBreweryService.cs @@ -0,0 +1,64 @@ +using Domain.Entities; + +namespace Service.Breweries; + +public record BreweryCreateRequest( + Guid PostedById, + string BreweryName, + string Description, + BreweryLocationCreateRequest Location +); + +public record BreweryLocationCreateRequest( + Guid CityId, + string AddressLine1, + string? AddressLine2, + string PostalCode, + byte[]? Coordinates +); + +public record BreweryUpdateRequest( + Guid BreweryPostId, + Guid PostedById, + string BreweryName, + string Description, + BreweryLocationUpdateRequest? Location +); + +public record BreweryLocationUpdateRequest( + Guid BreweryPostLocationId, + Guid CityId, + string AddressLine1, + string? AddressLine2, + string PostalCode, + byte[]? Coordinates +); + +public record BreweryServiceReturn +{ + public bool Success { get; init; } + public BreweryPost Brewery { get; init; } + public string Message { get; init; } = string.Empty; + + public BreweryServiceReturn(BreweryPost brewery) + { + Success = true; + Brewery = brewery; + } + + public BreweryServiceReturn(string message) + { + Success = false; + Brewery = default!; + Message = message; + } +} + +public interface IBreweryService +{ + Task GetByIdAsync(Guid id); + Task> GetAllAsync(int? limit = null, int? offset = null); + Task CreateAsync(BreweryCreateRequest request); + Task UpdateAsync(BreweryUpdateRequest request); + Task DeleteAsync(Guid id); +} diff --git a/src/Core/Service/Service.Breweries/Service.Breweries.csproj b/src/Core/Service/Service.Breweries/Service.Breweries.csproj new file mode 100644 index 0000000..578b547 --- /dev/null +++ b/src/Core/Service/Service.Breweries/Service.Breweries.csproj @@ -0,0 +1,12 @@ + + + net10.0 + enable + enable + + + + + + + From 92ec16ce930b0c7d1d91f552086861ae421ad0f4 Mon Sep 17 00:00:00 2001 From: Aaron Po Date: Mon, 20 Apr 2026 01:58:19 -0400 Subject: [PATCH 2/3] Feat/add sqllite to cpp pipeline (#206) --- pipeline/CMakeLists.txt | 33 +++ pipeline/README.md | 69 ++--- pipeline/diagrams/activity-diagram.puml | 101 ++++--- pipeline/diagrams/class-diagram.puml | 36 +++ pipeline/includes/biergarten_data_generator.h | 8 +- .../includes/services/date_time_provider.h | 66 +++++ pipeline/includes/services/export_service.h | 40 +++ .../includes/services/sqlite_export_service.h | 59 +++++ .../services/sqlite_export_service_helpers.h | 250 ++++++++++++++++++ .../biergarten_data_generator.cc | 6 +- .../generate_breweries.cc | 19 ++ pipeline/src/biergarten_data_generator/run.cc | 3 + pipeline/src/main.cc | 8 +- .../services/sqlite/build_database_path.cc | 24 ++ .../src/services/sqlite/build_location_key.cc | 28 ++ pipeline/src/services/sqlite/finalize.cc | 30 +++ .../services/sqlite/finalize_statements.cc | 11 + pipeline/src/services/sqlite/initialize.cc | 39 +++ .../src/services/sqlite/initialize_schema.cc | 16 ++ .../src/services/sqlite/prepare_statements.cc | 16 ++ .../src/services/sqlite/process_record.cc | 100 +++++++ .../sqlite/rollback_and_close_no_throw.cc | 21 ++ .../services/sqlite/sqlite_export_service.cc | 17 ++ 23 files changed, 909 insertions(+), 91 deletions(-) create mode 100644 pipeline/includes/services/date_time_provider.h create mode 100644 pipeline/includes/services/export_service.h create mode 100644 pipeline/includes/services/sqlite_export_service.h create mode 100644 pipeline/includes/services/sqlite_export_service_helpers.h create mode 100644 pipeline/src/services/sqlite/build_database_path.cc create mode 100644 pipeline/src/services/sqlite/build_location_key.cc create mode 100644 pipeline/src/services/sqlite/finalize.cc create mode 100644 pipeline/src/services/sqlite/finalize_statements.cc create mode 100644 pipeline/src/services/sqlite/initialize.cc create mode 100644 pipeline/src/services/sqlite/initialize_schema.cc create mode 100644 pipeline/src/services/sqlite/prepare_statements.cc create mode 100644 pipeline/src/services/sqlite/process_record.cc create mode 100644 pipeline/src/services/sqlite/rollback_and_close_no_throw.cc create mode 100644 pipeline/src/services/sqlite/sqlite_export_service.cc diff --git a/pipeline/CMakeLists.txt b/pipeline/CMakeLists.txt index 02f769b..0c0aab1 100644 --- a/pipeline/CMakeLists.txt +++ b/pipeline/CMakeLists.txt @@ -60,6 +60,28 @@ endif() # Require system Boost for JSON and Program Options to speed up build times find_package(Boost REQUIRED COMPONENTS json program_options) +FetchContent_Declare( + sqlite_amalgamation + URL https://www.sqlite.org/2026/sqlite-amalgamation-3530000.zip + URL_HASH SHA3_256=c2325c53b3b41761469f91cfb078e96882ac5d85bac10c11b0bd8f253b031e5b +) +FetchContent_GetProperties(sqlite_amalgamation) +if(NOT sqlite_amalgamation_POPULATED) + FetchContent_Populate(sqlite_amalgamation) +endif() + +if(NOT TARGET sqlite3) + add_library(sqlite3 STATIC + ${sqlite_amalgamation_SOURCE_DIR}/sqlite3.c + ) + target_include_directories(sqlite3 PUBLIC + ${sqlite_amalgamation_SOURCE_DIR} + ) + target_compile_definitions(sqlite3 PUBLIC + SQLITE_THREADSAFE=1 + ) +endif() + FetchContent_Declare( llama-cpp GIT_REPOSITORY https://github.com/ggml-org/llama.cpp.git @@ -97,6 +119,16 @@ set(SOURCES src/services/wikipedia/wikipedia_service.cc src/services/wikipedia/get_summary.cc src/services/wikipedia/fetch_extract.cc + src/services/sqlite/sqlite_export_service.cc + src/services/sqlite/build_database_path.cc + src/services/sqlite/build_location_key.cc + src/services/sqlite/initialize_schema.cc + src/services/sqlite/prepare_statements.cc + src/services/sqlite/initialize.cc + src/services/sqlite/process_record.cc + src/services/sqlite/finalize_statements.cc + src/services/sqlite/rollback_and_close_no_throw.cc + src/services/sqlite/finalize.cc src/web_client/curl_global_state.cc src/web_client/curl_web_client_get.cc src/web_client/curl_web_client_url_encode.cc @@ -129,6 +161,7 @@ target_link_libraries(${PROJECT_NAME} PRIVATE Boost::json Boost::program_options spdlog::spdlog + sqlite3 CURL::libcurl ) diff --git a/pipeline/README.md b/pipeline/README.md index 5463382..103d9dd 100644 --- a/pipeline/README.md +++ b/pipeline/README.md @@ -6,7 +6,7 @@ A C++20 command-line pipeline that samples city records from local JSON, enriche ## Table of Contents -- [How It Fits the Main App](#how-it-fits-the-main-app) +- [How It Fits The Main App](#how-it-fits-the-main-app) - [Tech Stack](#tech-stack) - [Build](#build) - [Model](#model) @@ -26,7 +26,7 @@ A C++20 command-line pipeline that samples city records from local JSON, enriche --- -## How It Fits the Main App +## How It Fits The Main App The pipeline is a data ingestion layer. It sits outside the web app runtime and produces seed records the app imports at startup or during a dedicated seed step. @@ -46,17 +46,19 @@ The pipeline is a data ingestion layer. It sits outside the web app runtime and - Boost.JSON, Boost.ProgramOptions, Boost.DI - spdlog - libcurl +- SQLite amalgamation fetched and compiled via CMake FetchContent - llama.cpp -The build fetches Boost.DI, spdlog, and llama.cpp via CMake. Metal is enabled on Apple Silicon; CUDA or HIP/ROCm is detected on Linux when the toolkit is present. +The build fetches Boost.DI, spdlog, llama.cpp, and SQLite via CMake. Metal is enabled on Apple Silicon; CUDA or HIP/ROCm is detected on Linux when the toolkit is present. -> **Code Style:** Modern C++20 throughout — RAII for ownership, `std::unique_ptr` for injected dependencies, `std::optional` for parse outcomes, `std::span` for read-only views over generated city data, structured bindings in pipeline loops. Formatting follows the Google C++ Style Guide via `.clang-format` with a narrow column limit and two-space indentation. +> **Code Style:** Modern C++20 throughout - RAII for ownership, `std::unique_ptr` for injected dependencies, `std::optional` for parse outcomes, `std::span` for read-only views over generated city data, structured bindings in pipeline loops. Formatting follows the Google C++ Style Guide via `.clang-format` with a narrow column limit and two-space indentation. --- ## Build Requirements: C++20 compiler, CMake 3.24+, libcurl, Boost (JSON and ProgramOptions). +SQLite is fetched from the upstream amalgamation, so no system SQLite package is required. ```bash cmake -S . -B build @@ -80,7 +82,7 @@ curl -L \ ## Run -Run from `build/` so the copied `locations.json` and `prompts/` are available. +Run from `build/` so the copied `locations.json` and `prompts/` are available. Each run also writes a fresh dated SQLite file such as `biergarten_seed_2026-04-19T15-30-45.123456Z.sqlite` into the working directory. ```bash ./biergarten-pipeline --mocked @@ -102,7 +104,7 @@ Run from `build/` so the copied `locations.json` and `prompts/` are available. `--mocked` and `--model` are mutually exclusive. Omitting both exits with an error before the pipeline starts. Sampling flags are ignored when `--mocked` is set. -The post-build step copies `prompts/` into `build/prompts/`. Rebuild after editing [prompts/system.md](prompts/system.md). +The post-build step copies `prompts/` into `build/prompts/`. Rebuild after editing `prompts/system.md`. --- @@ -110,23 +112,25 @@ The post-build step copies `prompts/` into `build/prompts/`. Rebuild after editi ### Pipeline Stages -| Stage | Implementation | -| -------- | -------------------------------------------------------------------------------------------------------------- | -| Load | `JsonLoader::LoadLocations()` reads `locations.json` into typed `Location` records. | -| Sample | `BiergartenDataGenerator::QueryCitiesWithCountries()` samples up to 50 locations per run. | -| Enrich | `WikipediaService` fetches city and beer context. Keeps going when a lookup fails. | -| Generate | `MockGenerator` or `LlamaGenerator` produces brewery names and descriptions in English and the local language. | -| Log | `spdlog` writes results and warnings to the console. | +| Stage | Implementation | +| -------- | --------------------------------------------------------------------------------------------------------------------------------------- | +| Load | `JsonLoader::LoadLocations()` reads `locations.json` into typed `Location` records. | +| Sample | `BiergartenDataGenerator::QueryCitiesWithCountries()` samples up to 50 locations per run. | +| Enrich | `WikipediaService` fetches city and beer context. Keeps going when a lookup fails. | +| Generate | `MockGenerator` or `LlamaGenerator` produces brewery names and descriptions in English and the local language. | +| Store | `SqliteExportService` writes each successful brewery into a fresh dated `.sqlite` database with normalized location and brewery tables. | +| Log | `spdlog` writes results and warnings to the console. | If enrichment or generation fails for a city, that city is skipped and the pipeline continues. ### Key Components -- `src/main.cc` — argument parsing and Boost.DI composition root. -- `JsonLoader` — validates curated location input. -- `WikipediaService` — queries Wikipedia extracts, caches results, returns empty context on failure. -- `LlamaGenerator` — formats prompts for Gemma 4, validates JSON output, retries malformed responses up to three times. If output looks truncated, the retry raises the token budget before trying again. -- `MockGenerator` — stable hash-based output so the same city input always produces the same brewery. +- `src/main.cc` - argument parsing and Boost.DI composition root. +- `JsonLoader` - validates curated location input. +- `WikipediaService` - queries Wikipedia extracts, caches results, returns empty context on failure. +- `LlamaGenerator` - formats prompts for Gemma 4, validates JSON output, retries malformed responses up to three times. If output looks truncated, the retry raises the token budget before trying again. +- `MockGenerator` - stable hash-based output so the same city input always produces the same brewery. +- `SqliteExportService` - creates a dated SQLite file per run and persists each successful brewery into normalized tables. - Brewery payloads include English and local-language name and description fields. ### Runtime Behaviour @@ -139,11 +143,11 @@ If enrichment or generation fails for a city, that city is skipped and the pipel `MockGenerator` uses stable hashes for repeatable output in demos and Storybook runs. -### Process Flow — Activity Diagram +### Process Flow - Activity Diagram ![An activity diagram](./diagrams/activity-diagram.svg) -### Architectural Overview — Class Diagram +### Architectural Overview - Class Diagram ![A class diagram](./diagrams/class-diagram.svg) @@ -151,7 +155,7 @@ If enrichment or generation fails for a city, that city is skipped and the pipel ## Generated Output -Each successful run stores a `GeneratedBrewery` pair with the source location and a `BreweryResult` payload. +Each successful run stores a `GeneratedBrewery` pair with the source location and a `BreweryResult` payload. The same generated records are also written to a fresh SQLite export file named with the current UTC timestamp. | Field | Meaning | | ------------------- | ------------------------------------------ | @@ -255,7 +259,7 @@ For languages such as Welsh (Wales), Maori (Aotearoa/New Zealand), or Sicilian ( ## Tested Hardware -### ARM macOS — M1 Pro +### ARM macOS - M1 Pro | | | | --------- | --------------------------------- | @@ -266,7 +270,7 @@ For languages such as Welsh (Wales), Maori (Aotearoa/New Zealand), or Sicilian ( | Model | Gemma 4 E4B | | Inference | llama.cpp with Metal | -### x86_64 Linux — NVIDIA RTX 2000 +### x86_64 Linux - NVIDIA RTX 2000 | | | | --------- | ------------------------------ | @@ -293,11 +297,12 @@ For languages such as Welsh (Wales), Maori (Aotearoa/New Zealand), or Sicilian ( ## Code Tour -- `src/main.cc` — argument parsing and DI composition root. -- `src/biergarten_data_generator/` — orchestration, sampling, logging. -- `src/services/wikipedia/` — enrichment service and cache. -- `src/data_generation/llama/` — local inference, prompt loading, output validation. -- `src/data_generation/mock/` — deterministic fallback. +- `src/main.cc` - argument parsing and DI composition root. +- `src/biergarten_data_generator/` - orchestration, sampling, logging, and export. +- `src/services/wikipedia/` - enrichment service and cache. +- `src/services/sqlite/` - SQLite export implementation. +- `src/data_generation/llama/` - local inference, prompt loading, output validation. +- `src/data_generation/mock/` - deterministic fallback. --- @@ -312,11 +317,7 @@ For languages such as Welsh (Wales), Maori (Aotearoa/New Zealand), or Sicilian ( ## Next Steps -The pipeline currently produces city-aware brewery records. The next passes add SQLite output and additional fixture types so the app can exercise the full brewery domain without live data. - -### SQLite Output _(Highest Importance)_ - -Write generated records to a SQLite database for downstream OLTP seeding. Normalized schema with foreign keys between locations and breweries. Output replaces the current log-only result so the pipeline functions as a proper ingestion layer. +The pipeline currently produces city-aware brewery records and dated SQLite exports. The next passes add additional fixture types so the app can exercise the full brewery domain without live data. ### Testing _(Very High Importance)_ @@ -336,7 +337,7 @@ Generate user profiles with stable names, bios, locale hints, and preference sig ### Check-In System -Produce timestamped check-in events between users and breweries. Use a J-curve activity profile — a small set of users accounts for most check-ins, the rest appear occasionally. Add bursty behaviour around weekends and travel periods. +Produce timestamped check-in events between users and breweries. Use a J-curve activity profile - a small set of users accounts for most check-ins, the rest appear occasionally. Add bursty behaviour around weekends and travel periods. ### Beer Ratings diff --git a/pipeline/diagrams/activity-diagram.puml b/pipeline/diagrams/activity-diagram.puml index bc95437..87caefb 100644 --- a/pipeline/diagrams/activity-diagram.puml +++ b/pipeline/diagrams/activity-diagram.puml @@ -15,19 +15,14 @@ skinparam ActivityBorderColor #547461 skinparam ActivityDiamondBackgroundColor #FAFCF9 skinparam ActivityDiamondBorderColor #628A5B skinparam ActivityBarColor #628A5B -skinparam SwimlaneBorderColor transparent -skinparam SwimlaneBorderThickness 0 +skinparam SwimlaneBorderColor #547461 +skinparam SwimlaneBorderThickness 0.3 -title The Biergarten Data Pipeline +title The Biergarten Data Pipeline (Streaming Architecture) |#F2F6F0|main.cc| start :ParseArguments(argc, argv); -note right - Validates --mocked, --model, - --temperature, --top-p, etc. -end note - if (Are arguments valid?) then (no) :spdlog::error usage info; stop @@ -36,14 +31,23 @@ endif :Init CurlGlobalState & LlamaBackendState; :di::make_injector(...); -note right - Binds CURLWebClient, WikipediaService, - Gemma4JinjaPromptFormatter, and - either MockGenerator or LlamaGenerator -end note -:injector.create(); +:injector.create>(); :BiergartenDataGenerator::Run(); +|#EAF0E8|BiergartenDataGenerator| +:Initialize SQLite export; + +|#E0EAE0|SqliteExportService| +:GetUtcTimestamp() from SystemDateTimeProvider; +:Initialize(); +note right + Builds a fresh biergarten_seed_.sqlite filename + Appends a numeric suffix if the timestamp already exists + Opens DB Connection + Executes Schema DDL + Begins Transaction +end note + |#EAF0E8|BiergartenDataGenerator| :QueryCitiesWithCountries(); @@ -55,71 +59,64 @@ end note while (For each sampled Location?) is (Remaining cities) |#DCE8D8|WikipediaService| :GetLocationContext(loc); - :FetchExtract("City, Country"); - :FetchExtract("beer in Country"); - :FetchExtract("beer in City"); - note right: Backed by CURLWebClient::Get - + :FetchExtracts(City, Country, Beer); |#EAF0E8|BiergartenDataGenerator| - if (Lookup failed?) then (yes) - :spdlog::warn "context lookup failed"; - else (no) - :Store EnrichedCity{Location, region_context}; - endif + :Store EnrichedCity{Location, region_context}; endwhile (Done) +|#EAF0E8|BiergartenDataGenerator| :GenerateBreweries(enriched_cities); |#E5EDE1|DataGenerator| while (For each EnrichedCity?) is (Remaining cities) if (Generator Mode) then (MockGenerator) - :DeterministicHash(location); - :Select from kBreweryAdjectives, kBreweryNouns,\nkBreweryDescriptions; - :Format BreweryResult; + :DeterministicHash & Format; else (LlamaGenerator) - :PrepareRegionContext(region_context); + :PrepareRegionContext; :LoadBrewerySystemPrompt("prompts/system.md"); - :Format user_prompt; - :Attempt = 0; repeat :Infer(system_prompt, user_prompt, max_tokens, kBreweryJsonGrammar); - note right - Uses Gemma4JinjaPromptFormatter, - llama_tokenize, and llama_sampler_sample - end note :ValidateBreweryJson(raw, brewery); - if (Is JSON Valid?) then (yes) break else (no) - if (Error == "incomplete JSON") then (yes) - :max_tokens += 700; - endif - :Update user_prompt with validation error; :Attempt++; endif - repeat while (Attempt < 3?) is (yes) - - if (Still Invalid?) then (yes) - :throw std::runtime_error; - else (no) - :Return BreweryResult; - endif endif |#EAF0E8|BiergartenDataGenerator| - if (Exception thrown?) then (yes) - :spdlog::warn "brewery generation failed"; + if (Generation successful?) then (yes) + |#E0EAE0|SqliteExportService| + :ProcessRecord(GeneratedBrewery); + if (Location in cache?) then (yes) + :Reuse location_id; + else (no) + :Insert Location & Cache ID; + endif + :Insert Brewery (FK: location_id); + + if (Exception caught during insert?) then (yes) + |#EAF0E8|BiergartenDataGenerator| + :spdlog::warn "Failed to stream record to SQLite export"; + note right + Data loss is prevented per-record. + The pipeline continues running. + end note + else (no) + endif else (no) - :Store GeneratedBrewery; + :spdlog::warn "Generation failed, skipping..."; endif |#E5EDE1|DataGenerator| endwhile (Done) -|#EAF0E8|BiergartenDataGenerator| -:LogResults(); -note right: spdlog::info dump of generated JSON fields +|#E0EAE0|SqliteExportService| +:Finalize(); +note right + Commits Transaction + Closes Database Connection +end note |#F2F6F0|main.cc| :Return 0; diff --git a/pipeline/diagrams/class-diagram.puml b/pipeline/diagrams/class-diagram.puml index 9046b96..74acc97 100644 --- a/pipeline/diagrams/class-diagram.puml +++ b/pipeline/diagrams/class-diagram.puml @@ -28,6 +28,7 @@ title The Biergarten Data Pipeline - Class Diagram class BiergartenDataGenerator { - context_service_ : std::unique_ptr - generator_ : std::unique_ptr + - exporter_ : std::unique_ptr - generated_breweries_ : std::vector + Run() : bool - QueryCitiesWithCountries() : std::vector @@ -92,9 +93,39 @@ class JsonLoader { + {static} LoadLocations(filepath : const std::filesystem::path&) : std::vector } +interface IExportService <> { + + Initialize() : void + + ProcessRecord(brewery : const GeneratedBrewery&) : void + + Finalize() : void +} + +class SqliteExportService { + - date_time_provider_ : std::unique_ptr + - run_timestamp_utc_ : std::string + - database_path_ : std::filesystem::path + - db_handle_ : sqlite3* + - insert_location_stmt_ : sqlite3_stmt* + - insert_brewery_stmt_ : sqlite3_stmt* + - transaction_open_ : bool + - location_cache_ : std::unordered_map + + Initialize() : void + + ProcessRecord(brewery : const GeneratedBrewery&) : void + + Finalize() : void + - InitializeSchema() : void +} + +interface IDateTimeProvider <> { + + GetUtcTimestamp() : std::string +} + +class SystemDateTimeProvider { + + GetUtcTimestamp() : std::string +} + ' Structural Relationships / Dependency Injection BiergartenDataGenerator *-- IEnrichmentService : owns BiergartenDataGenerator *-- DataGenerator : owns +BiergartenDataGenerator *-- IExportService : owns IEnrichmentService <|.. WikipediaService : implements WikipediaService *-- WebClient : owns @@ -109,4 +140,9 @@ LlamaGenerator *-- IPromptFormatter : uses IPromptFormatter <|.. Gemma4JinjaPromptFormatter : implements BiergartenDataGenerator ..> JsonLoader : uses + +IExportService <|.. SqliteExportService : implements +SqliteExportService *-- IDateTimeProvider : owns +IDateTimeProvider <|.. SystemDateTimeProvider : implements + @enduml diff --git a/pipeline/includes/biergarten_data_generator.h b/pipeline/includes/biergarten_data_generator.h index 260ea29..c4bd709 100644 --- a/pipeline/includes/biergarten_data_generator.h +++ b/pipeline/includes/biergarten_data_generator.h @@ -15,6 +15,7 @@ #include "data_model/generated_brewery.h" #include "data_model/location.h" #include "services/enrichment_service.h" +#include "services/export_service.h" /** * @brief Main data generator class for the Biergarten pipeline. @@ -29,9 +30,11 @@ class BiergartenDataGenerator { * * @param context_service Context provider for sampled locations. * @param generator Brewery and user data generator. + * @param exporter Storage backend for generated brewery data. */ BiergartenDataGenerator(std::unique_ptr context_service, - std::unique_ptr generator); + std::unique_ptr generator, + std::unique_ptr exporter); /** * @brief Run the data generation pipeline. @@ -52,6 +55,9 @@ class BiergartenDataGenerator { /// @brief Generator dependency selected in the composition root. std::unique_ptr generator_; + /// @brief Storage backend for generated brewery records. + std::unique_ptr exporter_; + /** * @brief Load locations from JSON and sample cities. * diff --git a/pipeline/includes/services/date_time_provider.h b/pipeline/includes/services/date_time_provider.h new file mode 100644 index 0000000..d535614 --- /dev/null +++ b/pipeline/includes/services/date_time_provider.h @@ -0,0 +1,66 @@ +#ifndef BIERGARTEN_PIPELINE_INCLUDES_SERVICES_DATE_TIME_PROVIDER_H_ +#define BIERGARTEN_PIPELINE_INCLUDES_SERVICES_DATE_TIME_PROVIDER_H_ + +/** + * @file services/date_time_provider.h + * @brief Abstraction for UTC timestamp generation. + */ + +#include +#include +#include +#include +#include +#include + +/** + * @brief Interface for UTC timestamp providers. + */ +class IDateTimeProvider { + public: + /// @brief Virtual destructor for polymorphic cleanup. + virtual ~IDateTimeProvider() = default; + + IDateTimeProvider() = default; + IDateTimeProvider(const IDateTimeProvider&) = delete; + IDateTimeProvider& operator=(const IDateTimeProvider&) = delete; + IDateTimeProvider(IDateTimeProvider&&) = delete; + IDateTimeProvider& operator=(IDateTimeProvider&&) = delete; + + /** + * @brief Returns the current UTC timestamp in a file-safe format. + * + * @return UTC timestamp string. + */ + virtual std::string GetUtcTimestamp() = 0; +}; + +/** + * @brief Timestamp provider backed by the system clock. + */ +class SystemDateTimeProvider final : public IDateTimeProvider { + public: + std::string GetUtcTimestamp() override { + constexpr int kFractionalSecondWidth = 6; + + const auto now = std::chrono::system_clock::now(); + const auto now_time = std::chrono::system_clock::to_time_t(now); + const std::tm* utc_time_ptr = std::gmtime(&now_time); + if (utc_time_ptr == nullptr) { + throw std::runtime_error("Failed to format UTC timestamp"); + } + + const auto fractional_seconds = + std::chrono::duration_cast( + now.time_since_epoch()) % + std::chrono::seconds(1); + + std::ostringstream output; + output << std::put_time(utc_time_ptr, "%Y-%m-%dT%H-%M-%S"); + output << '.' << std::setw(kFractionalSecondWidth) << std::setfill('0') + << fractional_seconds.count() << 'Z'; + return output.str(); + } +}; + +#endif // BIERGARTEN_PIPELINE_INCLUDES_SERVICES_DATE_TIME_PROVIDER_H_ diff --git a/pipeline/includes/services/export_service.h b/pipeline/includes/services/export_service.h new file mode 100644 index 0000000..a45c483 --- /dev/null +++ b/pipeline/includes/services/export_service.h @@ -0,0 +1,40 @@ +#ifndef BIERGARTEN_PIPELINE_INCLUDES_SERVICES_EXPORT_SERVICE_H_ +#define BIERGARTEN_PIPELINE_INCLUDES_SERVICES_EXPORT_SERVICE_H_ + +/** + * @file services/export_service.h + * @brief Abstraction for persisting generated brewery data. + */ + +#include "data_model/generated_brewery.h" + +/** + * @brief Interface for services that persist generated brewery records. + */ +class IExportService { + public: + IExportService() = default; + + /// @brief Virtual destructor for polymorphic cleanup. + virtual ~IExportService() = default; + + IExportService(const IExportService&) = delete; + IExportService& operator=(const IExportService&) = delete; + IExportService(IExportService&&) = delete; + IExportService& operator=(IExportService&&) = delete; + + /// @brief Prepares the export destination for a new run. + virtual void Initialize() = 0; + + /** + * @brief Persists one generated brewery record. + * + * @param brewery Generated brewery payload to store. + */ + virtual void ProcessRecord(const GeneratedBrewery& brewery) = 0; + + /// @brief Finalizes the export destination. + virtual void Finalize() = 0; +}; + +#endif // BIERGARTEN_PIPELINE_INCLUDES_SERVICES_EXPORT_SERVICE_H_ diff --git a/pipeline/includes/services/sqlite_export_service.h b/pipeline/includes/services/sqlite_export_service.h new file mode 100644 index 0000000..d3a7377 --- /dev/null +++ b/pipeline/includes/services/sqlite_export_service.h @@ -0,0 +1,59 @@ +#ifndef BIERGARTEN_PIPELINE_INCLUDES_SERVICES_SQLITE_EXPORT_SERVICE_H_ +#define BIERGARTEN_PIPELINE_INCLUDES_SERVICES_SQLITE_EXPORT_SERVICE_H_ + +/** + * @file services/sqlite_export_service.h + * @brief SQLite-backed export service for generated brewery data. + */ + +#include +#include +#include +#include + +#include "services/date_time_provider.h" +#include "services/export_service.h" +#include "services/sqlite_export_service_helpers.h" + +/** + * @brief Persists generated brewery records into a fresh SQLite database. + */ +class SqliteExportService final : public IExportService { + public: + SqliteExportService(); + ~SqliteExportService() override; + + SqliteExportService(const SqliteExportService&) = delete; + SqliteExportService& operator=(const SqliteExportService&) = delete; + SqliteExportService(SqliteExportService&&) = delete; + SqliteExportService& operator=(SqliteExportService&&) = delete; + + void Initialize() override; + void ProcessRecord(const GeneratedBrewery& brewery) override; + void Finalize() override; + + private: + using SqliteDatabaseHandle = + sqlite_export_service_internal::SqliteDatabaseHandle; + using SqliteStatementHandle = + sqlite_export_service_internal::SqliteStatementHandle; + + void InitializeSchema(); + void PrepareStatements(); + void RollbackAndCloseNoThrow() noexcept; + void FinalizeStatements() noexcept; + + [[nodiscard]] std::filesystem::path BuildDatabasePath() const; + [[nodiscard]] static std::string BuildLocationKey(const Location& location); + + std::unique_ptr date_time_provider_; + std::string run_timestamp_utc_; + std::filesystem::path database_path_; + SqliteDatabaseHandle db_handle_; + SqliteStatementHandle insert_location_stmt_; + SqliteStatementHandle insert_brewery_stmt_; + bool transaction_open_ = false; + std::unordered_map location_cache_; +}; + +#endif // BIERGARTEN_PIPELINE_INCLUDES_SERVICES_SQLITE_EXPORT_SERVICE_H_ diff --git a/pipeline/includes/services/sqlite_export_service_helpers.h b/pipeline/includes/services/sqlite_export_service_helpers.h new file mode 100644 index 0000000..e4e9ae0 --- /dev/null +++ b/pipeline/includes/services/sqlite_export_service_helpers.h @@ -0,0 +1,250 @@ +#ifndef BIERGARTEN_PIPELINE_INCLUDES_SERVICES_SQLITE_EXPORT_SERVICE_HELPERS_H_ +#define BIERGARTEN_PIPELINE_INCLUDES_SERVICES_SQLITE_EXPORT_SERVICE_HELPERS_H_ + +/** + * @file services/sqlite_export_service_helpers.h + * @brief Internal SQLite export helpers shared across per-method translation + * units. + */ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace sqlite_export_service_internal { + +struct SqliteDatabaseDeleter { + void operator()(sqlite3* handle) const noexcept { + if (handle != nullptr) { + sqlite3_close(handle); + } + } +}; + +struct SqliteStatementDeleter { + void operator()(sqlite3_stmt* statement) const noexcept { + if (statement != nullptr) { + sqlite3_finalize(statement); + } + } +}; + +using SqliteDatabaseHandle = std::unique_ptr; +using SqliteStatementHandle = + std::unique_ptr; + +inline constexpr std::string_view kCreateLocationsTableSql = R"sql( + +CREATE TABLE IF NOT EXISTS locations ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + city TEXT NOT NULL, + state_province TEXT NOT NULL, + iso3166_2 TEXT NOT NULL, + country TEXT NOT NULL, + iso3166_1 TEXT NOT NULL, + local_languages_json TEXT NOT NULL, + latitude REAL NOT NULL, + longitude REAL NOT NULL, + UNIQUE(city, state_province, iso3166_2, country, latitude, longitude) +); + +)sql"; + +inline constexpr std::string_view kCreateBreweriesTableSql = R"sql( + +CREATE TABLE IF NOT EXISTS breweries ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + location_id INTEGER NOT NULL, + name_en TEXT NOT NULL, + description_en TEXT NOT NULL, + name_local TEXT NOT NULL, + description_local TEXT NOT NULL, + FOREIGN KEY(location_id) REFERENCES locations(id) ON DELETE CASCADE +); + +CREATE INDEX IF NOT EXISTS idx_breweries_location_id ON breweries(location_id); + +)sql"; + +inline constexpr std::string_view kInsertLocationSql = R"sql( +INSERT INTO locations ( + city, + state_province, + iso3166_2, + country, + iso3166_1, + local_languages_json, + latitude, + longitude +) VALUES (?, ?, ?, ?, ?, ?, ?, ?); +)sql"; + +inline constexpr std::string_view kInsertBrewerySql = R"sql( +INSERT INTO breweries ( + location_id, + name_en, + description_en, + name_local, + description_local +) VALUES (?, ?, ?, ?, ?); +)sql"; + +inline constexpr int kLocationCityBindIndex = 1; +inline constexpr int kLocationStateProvinceBindIndex = 2; +inline constexpr int kLocationIso31662BindIndex = 3; +inline constexpr int kLocationCountryBindIndex = 4; +inline constexpr int kLocationIso31661BindIndex = 5; +inline constexpr int kLocationLanguagesBindIndex = 6; +inline constexpr int kLocationLatitudeBindIndex = 7; +inline constexpr int kLocationLongitudeBindIndex = 8; + +inline constexpr int kBreweryLocationIdBindIndex = 1; +inline constexpr int kBreweryEnglishNameBindIndex = 2; +inline constexpr int kBreweryEnglishDescriptionBindIndex = 3; +inline constexpr int kBreweryLocalNameBindIndex = 4; +inline constexpr int kBreweryLocalDescriptionBindIndex = 5; + +inline void ThrowSqliteError(sqlite3* db_handle, std::string_view action) { + const std::string message = + db_handle != nullptr ? sqlite3_errmsg(db_handle) : "unknown SQLite error"; + throw std::runtime_error(std::string(action) + ": " + message); +} + +inline SqliteDatabaseHandle OpenDatabase(const std::filesystem::path& path) { + sqlite3* raw_handle = nullptr; + const std::string path_string = path.string(); + const int result = sqlite3_open(path_string.c_str(), &raw_handle); + SqliteDatabaseHandle handle(raw_handle); + if (result != SQLITE_OK) { + const std::string message = raw_handle != nullptr + ? sqlite3_errmsg(raw_handle) + : "unknown SQLite error"; + throw std::runtime_error("Failed to open SQLite export database: " + + message); + } + + return handle; +} + +inline void ExecSql(const SqliteDatabaseHandle& db_handle, std::string_view sql, + const char* action) { + char* error_message = nullptr; + const std::string sql_text(sql); + const int result = sqlite3_exec(db_handle.get(), sql_text.c_str(), nullptr, + nullptr, &error_message); + if (result != SQLITE_OK) { + const std::string message = error_message != nullptr + ? error_message + : sqlite3_errmsg(db_handle.get()); + sqlite3_free(error_message); + throw std::runtime_error(std::string(action) + ": " + message); + } +} + +inline SqliteStatementHandle PrepareStatement( + const SqliteDatabaseHandle& db_handle, std::string_view sql, + const char* action) { + sqlite3_stmt* raw_statement = nullptr; + const std::string sql_text(sql); + const int result = sqlite3_prepare_v2(db_handle.get(), sql_text.c_str(), -1, + &raw_statement, nullptr); + SqliteStatementHandle statement(raw_statement); + if (result != SQLITE_OK) { + ThrowSqliteError(db_handle.get(), action); + } + + return statement; +} + +inline void ResetStatement(SqliteStatementHandle& statement) { + if (statement != nullptr) { + sqlite3_reset(statement.get()); + sqlite3_clear_bindings(statement.get()); + } +} + +inline void DeleteCharArray(void* data) noexcept { + delete[] static_cast(data); +} + +inline void BindText(const SqliteStatementHandle& statement, int index, + std::string_view value, const char* action) { + const auto byte_count = value.size(); + if (byte_count > static_cast(std::numeric_limits::max())) { + ThrowSqliteError(sqlite3_db_handle(statement.get()), action); + } + + auto buffer = std::make_unique(byte_count + 1); + std::memcpy(buffer.get(), value.data(), byte_count); + buffer[byte_count] = '\0'; + + char* raw_buffer = buffer.release(); + const int result = + sqlite3_bind_text(statement.get(), index, raw_buffer, + static_cast(byte_count), DeleteCharArray); + if (result != SQLITE_OK) { + DeleteCharArray(raw_buffer); + ThrowSqliteError(sqlite3_db_handle(statement.get()), action); + } +} + +inline void BindDouble(const SqliteStatementHandle& statement, int index, + double value, std::string_view action) { + const int result = sqlite3_bind_double(statement.get(), index, value); + if (result != SQLITE_OK) { + ThrowSqliteError(sqlite3_db_handle(statement.get()), action); + } +} + +inline void BindInt64(const SqliteStatementHandle& statement, int index, + sqlite3_int64 value, std::string_view action) { + const int result = sqlite3_bind_int64(statement.get(), index, value); + if (result != SQLITE_OK) { + ThrowSqliteError(sqlite3_db_handle(statement.get()), action); + } +} + +inline void StepStatement(const SqliteDatabaseHandle& db_handle, + const SqliteStatementHandle& statement, + std::string_view action) { + const int result = sqlite3_step(statement.get()); + if (result != SQLITE_DONE) { + ThrowSqliteError(db_handle.get(), action); + } +} + +inline sqlite3_int64 LastInsertRowId(const SqliteDatabaseHandle& db_handle) { + return sqlite3_last_insert_rowid(db_handle.get()); +} + +inline void RollbackTransactionNoThrow( + const SqliteDatabaseHandle& db_handle) noexcept { + if (!db_handle) { + return; + } + + sqlite3_exec(db_handle.get(), "ROLLBACK;", nullptr, nullptr, nullptr); +} + +inline std::string SerializeLocalLanguages( + const std::vector& local_languages) { + boost::json::array array; + array.reserve(local_languages.size()); + for (const auto& language : local_languages) { + array.emplace_back(language); + } + return boost::json::serialize(array); +} + +} // namespace sqlite_export_service_internal + +#endif // BIERGARTEN_PIPELINE_INCLUDES_SERVICES_SQLITE_EXPORT_SERVICE_HELPERS_H_ diff --git a/pipeline/src/biergarten_data_generator/biergarten_data_generator.cc b/pipeline/src/biergarten_data_generator/biergarten_data_generator.cc index b3dd072..033795d 100644 --- a/pipeline/src/biergarten_data_generator/biergarten_data_generator.cc +++ b/pipeline/src/biergarten_data_generator/biergarten_data_generator.cc @@ -9,6 +9,8 @@ BiergartenDataGenerator::BiergartenDataGenerator( std::unique_ptr context_service, - std::unique_ptr generator) + std::unique_ptr generator, + std::unique_ptr exporter) : context_service_(std::move(context_service)), - generator_(std::move(generator)) {} + generator_(std::move(generator)), + exporter_(std::move(exporter)) {} diff --git a/pipeline/src/biergarten_data_generator/generate_breweries.cc b/pipeline/src/biergarten_data_generator/generate_breweries.cc index 93b2c85..934c3dd 100644 --- a/pipeline/src/biergarten_data_generator/generate_breweries.cc +++ b/pipeline/src/biergarten_data_generator/generate_breweries.cc @@ -13,6 +13,7 @@ void BiergartenDataGenerator::GenerateBreweries( generated_breweries_.clear(); size_t skipped_count = 0; + size_t export_failed_count = 0; for (const auto& [location, region_context] : cities) { try { @@ -22,6 +23,17 @@ void BiergartenDataGenerator::GenerateBreweries( const GeneratedBrewery gen{.location = location, .brewery = brewery}; generated_breweries_.push_back(gen); + + try { + exporter_->ProcessRecord(gen); + } catch (const std::exception& export_exception) { + ++export_failed_count; + + spdlog::warn( + "[Pipeline] Generated brewery for '{}' ({}) but SQLite export " + "failed: {}", + location.city, location.country, export_exception.what()); + } } catch (const std::exception& e) { ++skipped_count; @@ -36,4 +48,11 @@ void BiergartenDataGenerator::GenerateBreweries( spdlog::warn("[Pipeline] Skipped {} city/cities due to generation errors", skipped_count); } + + if (export_failed_count > 0) { + spdlog::warn( + "[Pipeline] Failed to export {} generated brewery/breweries to " + "SQLite", + export_failed_count); + } } diff --git a/pipeline/src/biergarten_data_generator/run.cc b/pipeline/src/biergarten_data_generator/run.cc index 609c3e8..82ebbfc 100644 --- a/pipeline/src/biergarten_data_generator/run.cc +++ b/pipeline/src/biergarten_data_generator/run.cc @@ -11,6 +11,8 @@ bool BiergartenDataGenerator::Run() { try { + exporter_->Initialize(); + std::vector cities = QueryCitiesWithCountries(); std::vector enriched; enriched.reserve(cities.size()); @@ -40,6 +42,7 @@ bool BiergartenDataGenerator::Run() { } this->GenerateBreweries(enriched); + exporter_->Finalize(); this->LogResults(); return true; } catch (const std::exception& e) { diff --git a/pipeline/src/main.cc b/pipeline/src/main.cc index 896eb14..2ce3779 100644 --- a/pipeline/src/main.cc +++ b/pipeline/src/main.cc @@ -22,6 +22,8 @@ #include "data_model/application_options.h" #include "llama_backend_state.h" #include "services/enrichment_service.h" +#include "services/export_service.h" +#include "services/sqlite_export_service.h" #include "services/wikipedia_service.h" #include "web_client/curl_web_client.h" @@ -160,6 +162,7 @@ int main(const int argc, char** argv) { di::bind().to(), di::bind().to(options), di::bind().to(), + di::bind().to(), di::bind().to(), di::bind().to(options.model_path), di::bind().to( @@ -178,9 +181,10 @@ int main(const int argc, char** argv) { return inj.template create>(); })); - auto generator = injector.create(); + auto generator = + injector.create>(); - if (!generator.Run()) { + if (!generator->Run()) { spdlog::error("Pipeline execution failed"); return 1; } diff --git a/pipeline/src/services/sqlite/build_database_path.cc b/pipeline/src/services/sqlite/build_database_path.cc new file mode 100644 index 0000000..3a96cdf --- /dev/null +++ b/pipeline/src/services/sqlite/build_database_path.cc @@ -0,0 +1,24 @@ +/** + * @file services/sqlite/build_database_path.cc + * @brief SqliteExportService::BuildDatabasePath() implementation. + */ + +#include +#include + +#include "services/sqlite_export_service.h" + +std::filesystem::path SqliteExportService::BuildDatabasePath() const { + std::filesystem::path base_filename("biergarten_seed_" + run_timestamp_utc_ + + ".sqlite"); + std::filesystem::path candidate = + std::filesystem::current_path() / base_filename; + + for (int suffix = 1; std::filesystem::exists(candidate); ++suffix) { + candidate = std::filesystem::current_path() / + std::filesystem::path("biergarten_seed_" + run_timestamp_utc_ + + "-" + std::to_string(suffix) + ".sqlite"); + } + + return candidate; +} diff --git a/pipeline/src/services/sqlite/build_location_key.cc b/pipeline/src/services/sqlite/build_location_key.cc new file mode 100644 index 0000000..472f2d7 --- /dev/null +++ b/pipeline/src/services/sqlite/build_location_key.cc @@ -0,0 +1,28 @@ +/** + * @file services/sqlite/build_location_key.cc + * @brief SqliteExportService::BuildLocationKey() implementation. + */ + +#include +#include + +#include "services/sqlite_export_service.h" +#include "services/sqlite_export_service_helpers.h" + +constexpr int kLocationPrecision = 17; + +std::string SqliteExportService::BuildLocationKey(const Location& location) { + std::ostringstream key_stream; + key_stream << location.city << '\n' + << location.state_province << '\n' + << location.iso3166_2 << '\n' + << location.country << '\n' + << location.iso3166_1 << '\n' + << std::setprecision(kLocationPrecision) << location.latitude + << '\n' + << std::setprecision(kLocationPrecision) << location.longitude + << '\n' + << sqlite_export_service_internal::SerializeLocalLanguages( + location.local_languages); + return key_stream.str(); +} diff --git a/pipeline/src/services/sqlite/finalize.cc b/pipeline/src/services/sqlite/finalize.cc new file mode 100644 index 0000000..156ee3c --- /dev/null +++ b/pipeline/src/services/sqlite/finalize.cc @@ -0,0 +1,30 @@ +/** + * @file services/sqlite/finalize.cc + * @brief SqliteExportService::Finalize() implementation. + */ + +#include + +#include "services/sqlite_export_service.h" +#include "services/sqlite_export_service_helpers.h" + +void SqliteExportService::Finalize() { + if (db_handle_ == nullptr) { + return; + } + + try { + FinalizeStatements(); + if (transaction_open_) { + sqlite_export_service_internal::ExecSql( + db_handle_, "COMMIT;", "Failed to commit SQLite transaction"); + transaction_open_ = false; + } + + db_handle_.reset(); + location_cache_.clear(); + } catch (...) { + RollbackAndCloseNoThrow(); + throw; + } +} diff --git a/pipeline/src/services/sqlite/finalize_statements.cc b/pipeline/src/services/sqlite/finalize_statements.cc new file mode 100644 index 0000000..15b29a6 --- /dev/null +++ b/pipeline/src/services/sqlite/finalize_statements.cc @@ -0,0 +1,11 @@ +/** + * @file services/sqlite/finalize_statements.cc + * @brief SqliteExportService::FinalizeStatements() implementation. + */ + +#include "services/sqlite_export_service.h" + +void SqliteExportService::FinalizeStatements() noexcept { + insert_brewery_stmt_.reset(); + insert_location_stmt_.reset(); +} diff --git a/pipeline/src/services/sqlite/initialize.cc b/pipeline/src/services/sqlite/initialize.cc new file mode 100644 index 0000000..0d3fa3c --- /dev/null +++ b/pipeline/src/services/sqlite/initialize.cc @@ -0,0 +1,39 @@ +/** + * @file services/sqlite/initialize.cc + * @brief SqliteExportService::Initialize() implementation. + */ + +#include +#include +#include +#include + +#include "services/sqlite_export_service.h" +#include "services/sqlite_export_service_helpers.h" + +void SqliteExportService::Initialize() { + if (db_handle_ != nullptr) { + throw std::runtime_error("SQLite export service is already initialized"); + } + + run_timestamp_utc_ = date_time_provider_->GetUtcTimestamp(); + database_path_ = BuildDatabasePath(); + std::filesystem::create_directories(database_path_.parent_path()); + + db_handle_ = sqlite_export_service_internal::OpenDatabase(database_path_); + + try { + sqlite_export_service_internal::ExecSql( + db_handle_, "PRAGMA foreign_keys = ON;", + "Failed to enable SQLite foreign keys"); + InitializeSchema(); + PrepareStatements(); + sqlite_export_service_internal::ExecSql( + db_handle_, "BEGIN IMMEDIATE TRANSACTION;", + "Failed to begin SQLite transaction"); + transaction_open_ = true; + } catch (...) { + RollbackAndCloseNoThrow(); + throw; + } +} diff --git a/pipeline/src/services/sqlite/initialize_schema.cc b/pipeline/src/services/sqlite/initialize_schema.cc new file mode 100644 index 0000000..e9e22ef --- /dev/null +++ b/pipeline/src/services/sqlite/initialize_schema.cc @@ -0,0 +1,16 @@ +/** + * @file services/sqlite/initialize_schema.cc + * @brief SqliteExportService::InitializeSchema() implementation. + */ + +#include "services/sqlite_export_service.h" +#include "services/sqlite_export_service_helpers.h" + +void SqliteExportService::InitializeSchema() { + sqlite_export_service_internal::ExecSql( + db_handle_, sqlite_export_service_internal::kCreateLocationsTableSql, + "Failed to create SQLite locations table"); + sqlite_export_service_internal::ExecSql( + db_handle_, sqlite_export_service_internal::kCreateBreweriesTableSql, + "Failed to create SQLite breweries table"); +} diff --git a/pipeline/src/services/sqlite/prepare_statements.cc b/pipeline/src/services/sqlite/prepare_statements.cc new file mode 100644 index 0000000..ee61e4a --- /dev/null +++ b/pipeline/src/services/sqlite/prepare_statements.cc @@ -0,0 +1,16 @@ +/** + * @file services/sqlite/prepare_statements.cc + * @brief SqliteExportService::PrepareStatements() implementation. + */ + +#include "services/sqlite_export_service.h" +#include "services/sqlite_export_service_helpers.h" + +void SqliteExportService::PrepareStatements() { + insert_location_stmt_ = sqlite_export_service_internal::PrepareStatement( + db_handle_, sqlite_export_service_internal::kInsertLocationSql, + "Failed to prepare SQLite location insert statement"); + insert_brewery_stmt_ = sqlite_export_service_internal::PrepareStatement( + db_handle_, sqlite_export_service_internal::kInsertBrewerySql, + "Failed to prepare SQLite brewery insert statement"); +} diff --git a/pipeline/src/services/sqlite/process_record.cc b/pipeline/src/services/sqlite/process_record.cc new file mode 100644 index 0000000..4a84d80 --- /dev/null +++ b/pipeline/src/services/sqlite/process_record.cc @@ -0,0 +1,100 @@ +/** + * @file services/sqlite/process_record.cc + * @brief SqliteExportService::ProcessRecord() implementation. + */ + +#include +#include + +#include "services/sqlite_export_service.h" +#include "services/sqlite_export_service_helpers.h" + +void SqliteExportService::ProcessRecord(const GeneratedBrewery& brewery) { + if (db_handle_ == nullptr || !transaction_open_) { + throw std::runtime_error("SQLite export service is not initialized"); + } + + const std::string location_key = BuildLocationKey(brewery.location); + const auto cached_location = location_cache_.find(location_key); + sqlite3_int64 location_id = 0; + + if (cached_location != location_cache_.end()) { + location_id = cached_location->second; + } else { + const std::string local_languages_json = + sqlite_export_service_internal::SerializeLocalLanguages( + brewery.location.local_languages); + + sqlite_export_service_internal::BindText( + insert_location_stmt_, + sqlite_export_service_internal::kLocationCityBindIndex, + brewery.location.city, "Failed to bind SQLite location city"); + sqlite_export_service_internal::BindText( + insert_location_stmt_, + sqlite_export_service_internal::kLocationStateProvinceBindIndex, + brewery.location.state_province, + "Failed to bind SQLite location state/province"); + sqlite_export_service_internal::BindText( + insert_location_stmt_, + sqlite_export_service_internal::kLocationIso31662BindIndex, + brewery.location.iso3166_2, + "Failed to bind SQLite location ISO 3166-2 code"); + sqlite_export_service_internal::BindText( + insert_location_stmt_, + sqlite_export_service_internal::kLocationCountryBindIndex, + brewery.location.country, "Failed to bind SQLite location country"); + sqlite_export_service_internal::BindText( + insert_location_stmt_, + sqlite_export_service_internal::kLocationIso31661BindIndex, + brewery.location.iso3166_1, + "Failed to bind SQLite location ISO 3166-1 code"); + sqlite_export_service_internal::BindText( + insert_location_stmt_, + sqlite_export_service_internal::kLocationLanguagesBindIndex, + local_languages_json, "Failed to bind SQLite location languages"); + sqlite_export_service_internal::BindDouble( + insert_location_stmt_, + sqlite_export_service_internal::kLocationLatitudeBindIndex, + brewery.location.latitude, "Failed to bind SQLite location latitude"); + sqlite_export_service_internal::BindDouble( + insert_location_stmt_, + sqlite_export_service_internal::kLocationLongitudeBindIndex, + brewery.location.longitude, "Failed to bind SQLite location longitude"); + + sqlite_export_service_internal::StepStatement( + db_handle_, insert_location_stmt_, + "Failed to insert SQLite location row"); + + location_id = sqlite_export_service_internal::LastInsertRowId(db_handle_); + location_cache_.emplace(location_key, location_id); + sqlite_export_service_internal::ResetStatement(insert_location_stmt_); + } + + sqlite_export_service_internal::BindInt64( + insert_brewery_stmt_, + sqlite_export_service_internal::kBreweryLocationIdBindIndex, location_id, + "Failed to bind SQLite brewery location id"); + sqlite_export_service_internal::BindText( + insert_brewery_stmt_, + sqlite_export_service_internal::kBreweryEnglishNameBindIndex, + brewery.brewery.name_en, "Failed to bind SQLite brewery English name"); + sqlite_export_service_internal::BindText( + insert_brewery_stmt_, + sqlite_export_service_internal::kBreweryEnglishDescriptionBindIndex, + brewery.brewery.description_en, + "Failed to bind SQLite brewery English description"); + sqlite_export_service_internal::BindText( + insert_brewery_stmt_, + sqlite_export_service_internal::kBreweryLocalNameBindIndex, + brewery.brewery.name_local, "Failed to bind SQLite brewery local name"); + sqlite_export_service_internal::BindText( + insert_brewery_stmt_, + sqlite_export_service_internal::kBreweryLocalDescriptionBindIndex, + brewery.brewery.description_local, + "Failed to bind SQLite brewery local description"); + + sqlite_export_service_internal::StepStatement( + db_handle_, insert_brewery_stmt_, "Failed to insert SQLite brewery row"); + + sqlite_export_service_internal::ResetStatement(insert_brewery_stmt_); +} diff --git a/pipeline/src/services/sqlite/rollback_and_close_no_throw.cc b/pipeline/src/services/sqlite/rollback_and_close_no_throw.cc new file mode 100644 index 0000000..c90a395 --- /dev/null +++ b/pipeline/src/services/sqlite/rollback_and_close_no_throw.cc @@ -0,0 +1,21 @@ +/** + * @file services/sqlite/rollback_and_close_no_throw.cc + * @brief SqliteExportService::RollbackAndCloseNoThrow() implementation. + */ + +#include "services/sqlite_export_service.h" + +void SqliteExportService::RollbackAndCloseNoThrow() noexcept { + if (db_handle_ == nullptr) { + return; + } + + if (transaction_open_) { + sqlite_export_service_internal::RollbackTransactionNoThrow(db_handle_); + transaction_open_ = false; + } + + FinalizeStatements(); + db_handle_.reset(); + location_cache_.clear(); +} diff --git a/pipeline/src/services/sqlite/sqlite_export_service.cc b/pipeline/src/services/sqlite/sqlite_export_service.cc new file mode 100644 index 0000000..377c917 --- /dev/null +++ b/pipeline/src/services/sqlite/sqlite_export_service.cc @@ -0,0 +1,17 @@ +/** + * @file services/sqlite/sqlite_export_service.cc + * @brief SqliteExportService constructor and destructor implementation. + */ + +#include "services/sqlite_export_service.h" + +#include + +SqliteExportService::SqliteExportService() + : date_time_provider_(std::make_unique()) {} + +SqliteExportService::~SqliteExportService() { + if (db_handle_ != nullptr) { + RollbackAndCloseNoThrow(); + } +} \ No newline at end of file From d47e3ed7f04db90782917aa3a52a1e69e0435a2b Mon Sep 17 00:00:00 2001 From: Aaron Po Date: Mon, 20 Apr 2026 02:30:25 -0400 Subject: [PATCH 3/3] Move next js project to archive (#207) --- .../next-js-web-app}/.eslintrc.json | 0 .../next-js-web-app}/.prettierignore | 0 .../next-js-web-app}/.prettierrc | 0 .../next-js-web-app}/README.old.md | 0 .../next-js-web-app}/next.config.js | 0 .../next-js-web-app}/package-lock.json | 0 .../next-js-web-app}/package.json | 0 .../next-js-web-app}/postcss.config.js | 0 .../next-js-web-app}/public/background.jpg | Bin .../next-js-web-app}/public/favicon/about.txt | 0 .../public/favicon/android-chrome-192x192.png | Bin .../public/favicon/android-chrome-512x512.png | Bin .../public/favicon/apple-touch-icon.png | Bin .../public/favicon/favicon-16x16.png | Bin .../public/favicon/favicon-32x32.png | Bin .../next-js-web-app}/public/favicon/favicon.ico | Bin .../public/favicon/site.webmanifest | 0 .../next-js-web-app}/public/robots.txt | 0 .../next-js-web-app}/schema.svg | 0 .../src/components/Account/AccountInfo.tsx | 0 .../src/components/Account/BeerPostsByUser.tsx | 0 .../src/components/Account/BreweryPostsByUser.tsx | 0 .../src/components/Account/DeleteAccount.tsx | 0 .../src/components/Account/Security.tsx | 0 .../src/components/Account/UpdateProfileForm.tsx | 0 .../src/components/Account/UpdateProfileLink.tsx | 0 .../src/components/Account/UserAvatar.tsx | 0 .../src/components/Account/UserPosts.tsx | 0 .../src/components/BeerById/BeerCommentForm.tsx | 0 .../src/components/BeerById/BeerInfoHeader.tsx | 0 .../components/BeerById/BeerPostCommentsSection.tsx | 0 .../src/components/BeerById/BeerPostLikeButton.tsx | 0 .../BeerById/BeerRecommendationLoadingComponent.tsx | 0 .../src/components/BeerById/BeerRecommendations.tsx | 0 .../src/components/BeerIndex/BeerCard.tsx | 0 .../BeerStyleById/BeerStyleBeerSection.tsx | 0 .../BeerStyleById/BeerStyleCommentForm.tsx | 0 .../BeerStyleById/BeerStyleCommentSection.tsx | 0 .../components/BeerStyleById/BeerStyleHeader.tsx | 0 .../BeerStyleById/BeerStyleLikeButton.tsx | 0 .../src/components/BeerStyleIndex/BeerStyleCard.tsx | 0 .../components/BreweryById/BreweryBeerSection.tsx | 0 .../components/BreweryById/BreweryCommentForm.tsx | 0 .../BreweryById/BreweryCommentsSection.tsx | 0 .../components/BreweryById/BreweryInfoHeader.tsx | 0 .../src/components/BreweryById/BreweryPostMap.tsx | 0 .../src/components/BreweryIndex/BreweryCard.tsx | 0 .../BreweryIndex/BreweryPostLikeButton.tsx | 0 .../BreweryPost/CreateBreweryPostForm.tsx | 0 .../src/components/Comments/CommentCardBody.tsx | 0 .../src/components/Comments/CommentCardDropdown.tsx | 0 .../src/components/Comments/CommentContentBody.tsx | 0 .../src/components/Comments/CommentForm.tsx | 0 .../components/Comments/CommentLoadingCardBody.tsx | 0 .../components/Comments/CommentLoadingComponent.tsx | 0 .../src/components/Comments/CommentsComponent.tsx | 0 .../src/components/Comments/EditCommentBody.tsx | 0 .../src/components/Comments/NoCommentsCard.tsx | 0 .../src/components/Comments/types/index.ts | 0 .../src/components/CreateBeerPostForm.tsx | 0 .../src/components/EditBeerPostForm.tsx | 0 .../src/components/EditBreweryPostForm.tsx | 0 .../src/components/Login/LoginForm.tsx | 0 .../src/components/RegisterUserForm.tsx | 0 .../src/components/UserPage/UserFollowButton.tsx | 0 .../src/components/UserPage/UserHeader.tsx | 0 .../src/components/ui/CustomToast.tsx | 0 .../next-js-web-app}/src/components/ui/Layout.tsx | 0 .../src/components/ui/LikeButton.tsx | 0 .../src/components/ui/LoadingCard.tsx | 0 .../src/components/ui/LocationMarker.tsx | 0 .../next-js-web-app}/src/components/ui/Navbar.tsx | 0 .../src/components/ui/SmLoadingCard.tsx | 0 .../next-js-web-app}/src/components/ui/Spinner.tsx | 0 .../src/components/ui/forms/Button.tsx | 0 .../src/components/ui/forms/FormError.tsx | 0 .../src/components/ui/forms/FormInfo.tsx | 0 .../src/components/ui/forms/FormLabel.tsx | 0 .../src/components/ui/forms/FormPageLayout.tsx | 0 .../src/components/ui/forms/FormSegment.tsx | 0 .../src/components/ui/forms/FormSelect.tsx | 0 .../src/components/ui/forms/FormTextArea.tsx | 0 .../src/components/ui/forms/FormTextInput.tsx | 0 .../src/components/ui/maps/ControlPanel.tsx | 0 .../next-js-web-app}/src/config/auth/cookie.ts | 0 .../next-js-web-app}/src/config/auth/localStrat.ts | 0 .../next-js-web-app}/src/config/auth/passwordFns.ts | 0 .../next-js-web-app}/src/config/auth/session.ts | 0 .../next-js-web-app}/src/config/auth/types.ts | 0 .../src/config/cloudinary/CloudinaryStorage.ts | 0 .../src/config/cloudinary/helpers/deleteImage.ts | 0 .../next-js-web-app}/src/config/cloudinary/index.ts | 0 .../next-js-web-app}/src/config/env/index.ts | 0 .../next-js-web-app}/src/config/jwt/index.ts | 0 .../next-js-web-app}/src/config/mapbox/geocoder.ts | 0 .../src/config/multer/uploadMiddleware.ts | 0 .../src/config/nextConnect/NextConnectOptions.ts | 0 .../config/nextConnect/middleware/getCurrentUser.ts | 0 .../nextConnect/middleware/validateRequest.ts | 0 .../next-js-web-app}/src/config/pino/logger.ts | 0 .../src/config/sparkpost/sendEmail.ts | 0 .../next-js-web-app}/src/config/util/ServerError.ts | 0 .../next-js-web-app}/src/contexts/UserContext.tsx | 0 .../src/controllers/comments/beer-comments/index.ts | 0 .../comments/beer-style-comments/index.ts | 0 .../controllers/comments/brewery-comments/index.ts | 0 .../src/controllers/comments/types/index.ts | 0 .../src/controllers/images/beer-images/index.ts | 0 .../src/controllers/images/brewery-images/index.ts | 0 .../src/controllers/images/types/index.ts | 0 .../src/controllers/likes/beer-posts-likes/index.ts | 0 .../src/controllers/likes/beer-style-likes/index.ts | 0 .../controllers/likes/brewery-post-likes/index.ts | 0 .../src/controllers/likes/types/index.ts | 0 .../src/controllers/posts/beer-posts/index.ts | 0 .../src/controllers/posts/beer-posts/types/index.ts | 0 .../src/controllers/posts/beer-styles/index.ts | 0 .../controllers/posts/beer-styles/types/index.ts | 0 .../src/controllers/posts/breweries/index.ts | 0 .../src/controllers/posts/breweries/types/index.ts | 0 .../src/controllers/posts/types/index.ts | 0 .../src/controllers/users/auth/index.ts | 0 .../src/controllers/users/auth/types/index.ts | 0 .../src/controllers/users/profile/index.ts | 0 .../src/controllers/users/profile/types/index.ts | 0 .../next-js-web-app}/src/emails/ForgotEmail.tsx | 0 .../next-js-web-app}/src/emails/WelcomeEmail.tsx | 0 .../src/hooks/auth/useConfirmUser.ts | 0 .../src/hooks/auth/useRedirectIfLoggedIn.ts | 0 .../next-js-web-app}/src/hooks/auth/useUser.ts | 0 .../beer-comments/useBeerPostComments.ts | 0 .../beer-likes/useBeerPostLikeCount.ts | 0 .../beer-likes/useCheckIfUserLikesBeerPost.ts | 0 .../data-fetching/beer-posts/useBeerPostSearch.ts | 0 .../hooks/data-fetching/beer-posts/useBeerPosts.ts | 0 .../beer-posts/useBeerPostsByBeerStyles.ts | 0 .../beer-posts/useBeerPostsByBrewery.ts | 0 .../data-fetching/beer-posts/useBeerPostsByUser.ts | 0 .../beer-posts/useBeerRecommendations.ts | 0 .../beer-style-comments/useBeerStyleComments.ts | 0 .../beer-style-likes/useBeerStyleLikeCount.ts | 0 .../beer-style-likes/useCheckIfUserLikesBeerPost.ts | 0 .../data-fetching/beer-styles/useBeerStyles.ts | 0 .../brewery-comments/useBreweryPostComments.ts | 0 .../brewery-likes/useCheckIfUserLikesBreweryPost.ts | 0 .../brewery-likes/useGetBreweryPostLikeCount.ts | 0 .../brewery-posts/useBreweryMapPagePosts.ts | 0 .../data-fetching/brewery-posts/useBreweryPosts.ts | 0 .../brewery-posts/useBreweryPostsByUser.ts | 0 .../data-fetching/user-follows/useFollowStatus.ts | 0 .../user-follows/useGetUsersFollowedByUser.ts | 0 .../user-follows/useGetUsersFollowingUser.ts | 0 .../src/hooks/utilities/useGeolocation.ts | 0 .../src/hooks/utilities/useMediaQuery.ts | 0 .../src/hooks/utilities/useNavbar.ts | 0 .../src/hooks/utilities/useTheme.ts | 0 .../src/hooks/utilities/useTimeDistance.ts | 0 .../next-js-web-app}/src/pages/404.tsx | 0 .../next-js-web-app}/src/pages/500.tsx | 0 .../next-js-web-app}/src/pages/_app.tsx | 0 .../next-js-web-app}/src/pages/_document.tsx | 0 .../api/beers/[postId]/comments/[commentId].ts | 0 .../src/pages/api/beers/[postId]/comments/index.ts | 0 .../src/pages/api/beers/[postId]/images/index.ts | 0 .../src/pages/api/beers/[postId]/index.ts | 0 .../src/pages/api/beers/[postId]/like/index.ts | 0 .../src/pages/api/beers/[postId]/like/is-liked.ts | 0 .../src/pages/api/beers/[postId]/recommendations.ts | 0 .../next-js-web-app}/src/pages/api/beers/create.ts | 0 .../next-js-web-app}/src/pages/api/beers/index.ts | 0 .../next-js-web-app}/src/pages/api/beers/search.ts | 0 .../pages/api/beers/styles/[postId]/beers/index.ts | 0 .../beers/styles/[postId]/comments/[commentId].ts | 0 .../api/beers/styles/[postId]/comments/index.ts | 0 .../src/pages/api/beers/styles/[postId]/index.ts | 0 .../pages/api/beers/styles/[postId]/like/index.ts | 0 .../api/beers/styles/[postId]/like/is-liked.ts | 0 .../src/pages/api/beers/styles/create.ts | 0 .../src/pages/api/beers/styles/index.ts | 0 .../src/pages/api/breweries/[postId]/beers/index.ts | 0 .../api/breweries/[postId]/comments/[commentId].ts | 0 .../pages/api/breweries/[postId]/comments/index.ts | 0 .../pages/api/breweries/[postId]/images/index.ts | 0 .../src/pages/api/breweries/[postId]/index.ts | 0 .../src/pages/api/breweries/[postId]/like/index.ts | 0 .../pages/api/breweries/[postId]/like/is-liked.ts | 0 .../src/pages/api/breweries/create.ts | 0 .../src/pages/api/breweries/index.ts | 0 .../src/pages/api/breweries/map/index.ts | 0 .../src/pages/api/users/[id]/follow-user.ts | 0 .../src/pages/api/users/[id]/followers.ts | 0 .../src/pages/api/users/[id]/following.ts | 0 .../src/pages/api/users/[id]/index.ts | 0 .../src/pages/api/users/[id]/is-followed.ts | 0 .../src/pages/api/users/[id]/posts/beers.ts | 0 .../src/pages/api/users/[id]/posts/breweries.ts | 0 .../pages/api/users/[id]/profile/update-avatar.ts | 0 .../pages/api/users/[id]/profile/update-profile.ts | 0 .../src/pages/api/users/check-email.ts | 0 .../src/pages/api/users/check-username.ts | 0 .../next-js-web-app}/src/pages/api/users/confirm.ts | 0 .../next-js-web-app}/src/pages/api/users/current.ts | 0 .../src/pages/api/users/edit-password.ts | 0 .../src/pages/api/users/forgot-password.ts | 0 .../next-js-web-app}/src/pages/api/users/login.ts | 0 .../next-js-web-app}/src/pages/api/users/logout.ts | 0 .../src/pages/api/users/register.ts | 0 .../src/pages/api/users/resend-confirmation.ts | 0 .../next-js-web-app}/src/pages/beers/[id]/edit.tsx | 0 .../next-js-web-app}/src/pages/beers/[id]/index.tsx | 0 .../next-js-web-app}/src/pages/beers/index.tsx | 0 .../next-js-web-app}/src/pages/beers/search.tsx | 0 .../src/pages/beers/styles/[id]/index.tsx | 0 .../src/pages/beers/styles/index.tsx | 0 .../src/pages/breweries/[id]/beers/create.tsx | 0 .../src/pages/breweries/[id]/edit.tsx | 0 .../src/pages/breweries/[id]/index.tsx | 0 .../next-js-web-app}/src/pages/breweries/create.tsx | 0 .../next-js-web-app}/src/pages/breweries/index.tsx | 0 .../next-js-web-app}/src/pages/breweries/map.tsx | 0 .../next-js-web-app}/src/pages/index.tsx | 0 .../next-js-web-app}/src/pages/login/index.tsx | 0 .../next-js-web-app}/src/pages/register/index.tsx | 0 .../next-js-web-app}/src/pages/users/[id].tsx | 0 .../src/pages/users/account/edit-profile.tsx | 0 .../src/pages/users/account/index.tsx | 0 .../next-js-web-app}/src/pages/users/confirm.tsx | 0 .../next-js-web-app}/src/pages/users/current.tsx | 0 .../src/pages/users/forgot-password.tsx | 0 .../src/pages/users/reset-password.tsx | 0 .../next-js-web-app}/src/prisma/DBClient.ts | 0 .../prisma/migrations/20230502225418_/migration.sql | 0 .../prisma/migrations/20230510010306_/migration.sql | 0 .../prisma/migrations/20230603010553_/migration.sql | 0 .../prisma/migrations/20230918194402_/migration.sql | 0 .../prisma/migrations/20230922054646_/migration.sql | 0 .../prisma/migrations/20230923043953_/migration.sql | 0 .../prisma/migrations/20231009153905_/migration.sql | 0 .../prisma/migrations/20231106024511_/migration.sql | 0 .../prisma/migrations/20231112221155_/migration.sql | 0 .../src/prisma/migrations/migration_lock.toml | 0 .../next-js-web-app}/src/prisma/schema.prisma | 0 .../src/prisma/seed/clear/clearCloudinaryStorage.ts | 0 .../src/prisma/seed/clear/clearDatabase.ts | 0 .../next-js-web-app}/src/prisma/seed/clear/index.ts | 0 .../src/prisma/seed/create/createAdminUser.ts | 0 .../src/prisma/seed/create/createNewBeerImages.ts | 0 .../prisma/seed/create/createNewBeerPostComments.ts | 0 .../prisma/seed/create/createNewBeerPostLikes.ts | 0 .../src/prisma/seed/create/createNewBeerPosts.ts | 0 .../seed/create/createNewBeerStyleComments.ts | 0 .../prisma/seed/create/createNewBeerStyleLikes.ts | 0 .../src/prisma/seed/create/createNewBeerStyles.ts | 0 .../prisma/seed/create/createNewBreweryImages.ts | 0 .../seed/create/createNewBreweryPostComments.ts | 0 .../prisma/seed/create/createNewBreweryPostLikes.ts | 0 .../src/prisma/seed/create/createNewBreweryPosts.ts | 0 .../src/prisma/seed/create/createNewLocations.ts | 0 .../src/prisma/seed/create/createNewUserAvatars.ts | 0 .../src/prisma/seed/create/createNewUserFollows.ts | 0 .../src/prisma/seed/create/createNewUsers.ts | 0 .../next-js-web-app}/src/prisma/seed/index.ts | 0 .../src/prisma/seed/util/beerStyles.ts | 0 .../src/prisma/seed/util/canadianCities.ts | 0 .../src/prisma/seed/util/imageUrls.ts | 0 .../src/reducers/accountPageReducer.ts | 0 .../src/requests/comments/beer-comment/index.ts | 0 .../requests/comments/beer-comment/types/index.ts | 0 .../requests/comments/beer-style-comment/index.ts | 0 .../comments/beer-style-comment/types/index.ts | 0 .../src/requests/comments/brewery-comment/index.ts | 0 .../sendCreateBreweryCommentRequest.ts | 0 .../comments/brewery-comment/types/index.ts | 0 .../images/beer-image/sendUploadBeerImageRequest.ts | 0 .../brewery-image/sendUploadBreweryImageRequest.ts | 0 .../likes/beer-post-like/sendBeerPostLikeRequest.ts | 0 .../beer-style-like/sendBeerStyleLikeRequest.ts | 0 .../brewery-post-like/sendBreweryPostLikeRequest.ts | 0 .../src/requests/posts/beer-post/index.ts | 0 .../src/requests/posts/beer-post/types/index.ts | 0 .../src/requests/posts/brewery-post/index.ts | 0 .../src/requests/posts/brewery-post/types/index.ts | 0 .../src/requests/users/auth/index.ts | 0 .../src/requests/users/auth/types/index.ts | 0 .../users/profile/sendUpdateUserAvatarRequest.ts | 0 .../users/profile/sendUpdateUserProfileRequest.ts | 0 .../users/profile/validateUsernameRequest.ts | 0 .../src/services/comments/beer-comment/index.ts | 0 .../services/comments/beer-comment/types/index.ts | 0 .../services/comments/beer-style-comment/index.ts | 0 .../comments/beer-style-comment/types/index.ts | 0 .../src/services/comments/brewery-comment/index.ts | 0 .../comments/brewery-comment/types/index.ts | 0 .../src/services/images/beer-image/index.ts | 0 .../src/services/images/beer-image/types/index.ts | 0 .../src/services/images/brewery-image/index.ts | 0 .../services/images/brewery-image/types/index.ts | 0 .../src/services/likes/beer-post-like/index.ts | 0 .../beer-post-like/schema/BeerPostLikeSchema.ts | 0 .../services/likes/beer-post-like/types/index.ts | 0 .../src/services/likes/beer-style-like/index.ts | 0 .../beer-style-like/schema/BeerStyleLikeSchema.ts | 0 .../services/likes/beer-style-like/types/index.ts | 0 .../src/services/likes/brewery-post-like/index.ts | 0 .../schema/BreweryPostLikeSchema.ts | 0 .../services/likes/brewery-post-like/types/index.ts | 0 .../src/services/posts/beer-post/index.ts | 0 .../posts/beer-post/schema/BeerPostQueryResult.ts | 0 .../schema/CreateBeerPostValidationSchema.ts | 0 .../schema/EditBeerPostValidationSchema.ts | 0 .../src/services/posts/beer-post/types/index.ts | 0 .../src/services/posts/beer-style-post/index.ts | 0 .../beer-style-post/schema/BeerStyleQueryResult.ts | 0 .../schema/CreateBeerStyleValidationSchema.ts | 0 .../services/posts/beer-style-post/types/index.ts | 0 .../src/services/posts/brewery-post/index.ts | 0 .../schema/BreweryPostMapQueryResult.ts | 0 .../brewery-post/schema/BreweryPostQueryResult.ts | 0 .../brewery-post/schema/CreateBreweryPostSchema.ts | 0 .../CreateNewBreweryPostWithoutLocationSchema.ts | 0 .../schema/EditBreweryPostValidationSchema.ts | 0 .../brewery-post/schema/GetMapBreweryPostsSchema.ts | 0 .../src/services/posts/brewery-post/types/index.ts | 0 .../schema/CommentSchema/CommentQueryResult.ts | 0 .../CommentSchema/CreateCommentValidationSchema.ts | 0 .../ImageSchema/ImageMetadataValidationSchema.ts | 0 .../ImageSchema/ImageQueryValidationSchema.ts | 0 .../ImageSchema/UploadImageValidationSchema.ts | 0 .../services/schema/PaginatedQueryResponseSchema.ts | 0 .../src/services/users/auth/index.ts | 0 .../auth/schema/CreateUserValidationSchemas.ts | 0 .../services/users/auth/schema/EditUserSchema.ts | 0 .../src/services/users/auth/schema/GetUserSchema.ts | 0 .../users/auth/schema/LoginValidationSchema.ts | 0 .../users/auth/schema/TokenValidationSchema.ts | 0 .../users/auth/schema/UpdateProfileSchema.ts | 0 .../src/services/users/auth/types/index.ts | 0 .../src/services/users/profile/index.ts | 0 .../users/profile/schema/FollowInfoSchema.ts | 0 .../src/services/users/profile/types/index.ts | 0 .../next-js-web-app}/src/styles/globals.css | 0 .../next-js-web-app}/src/util/createErrorToast.ts | 0 .../src/util/withPageAuthRequired.ts | 0 .../src/validation/APIResponseValidationSchema.ts | 0 .../next-js-web-app}/tailwind.config.js | 0 .../next-js-web-app}/tsconfig.json | 0 .../next-js-web-app}/vercel.json | 0 347 files changed, 0 insertions(+), 0 deletions(-) rename {src/Website-v1 => archive/next-js-web-app}/.eslintrc.json (100%) rename {src/Website-v1 => archive/next-js-web-app}/.prettierignore (100%) rename {src/Website-v1 => archive/next-js-web-app}/.prettierrc (100%) rename {src/Website-v1 => archive/next-js-web-app}/README.old.md (100%) rename {src/Website-v1 => archive/next-js-web-app}/next.config.js (100%) rename {src/Website-v1 => archive/next-js-web-app}/package-lock.json (100%) rename {src/Website-v1 => archive/next-js-web-app}/package.json (100%) rename {src/Website-v1 => archive/next-js-web-app}/postcss.config.js (100%) rename {src/Website-v1 => archive/next-js-web-app}/public/background.jpg (100%) rename {src/Website-v1 => archive/next-js-web-app}/public/favicon/about.txt (100%) rename {src/Website-v1 => archive/next-js-web-app}/public/favicon/android-chrome-192x192.png (100%) rename {src/Website-v1 => archive/next-js-web-app}/public/favicon/android-chrome-512x512.png (100%) rename {src/Website-v1 => archive/next-js-web-app}/public/favicon/apple-touch-icon.png (100%) rename {src/Website-v1 => archive/next-js-web-app}/public/favicon/favicon-16x16.png (100%) rename {src/Website-v1 => archive/next-js-web-app}/public/favicon/favicon-32x32.png (100%) rename {src/Website-v1 => archive/next-js-web-app}/public/favicon/favicon.ico (100%) rename {src/Website-v1 => archive/next-js-web-app}/public/favicon/site.webmanifest (100%) rename {src/Website-v1 => archive/next-js-web-app}/public/robots.txt (100%) rename {src/Website-v1 => archive/next-js-web-app}/schema.svg (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/components/Account/AccountInfo.tsx (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/components/Account/BeerPostsByUser.tsx (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/components/Account/BreweryPostsByUser.tsx (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/components/Account/DeleteAccount.tsx (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/components/Account/Security.tsx (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/components/Account/UpdateProfileForm.tsx (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/components/Account/UpdateProfileLink.tsx (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/components/Account/UserAvatar.tsx (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/components/Account/UserPosts.tsx (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/components/BeerById/BeerCommentForm.tsx (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/components/BeerById/BeerInfoHeader.tsx (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/components/BeerById/BeerPostCommentsSection.tsx (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/components/BeerById/BeerPostLikeButton.tsx (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/components/BeerById/BeerRecommendationLoadingComponent.tsx (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/components/BeerById/BeerRecommendations.tsx (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/components/BeerIndex/BeerCard.tsx (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/components/BeerStyleById/BeerStyleBeerSection.tsx (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/components/BeerStyleById/BeerStyleCommentForm.tsx (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/components/BeerStyleById/BeerStyleCommentSection.tsx (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/components/BeerStyleById/BeerStyleHeader.tsx (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/components/BeerStyleById/BeerStyleLikeButton.tsx (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/components/BeerStyleIndex/BeerStyleCard.tsx (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/components/BreweryById/BreweryBeerSection.tsx (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/components/BreweryById/BreweryCommentForm.tsx (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/components/BreweryById/BreweryCommentsSection.tsx (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/components/BreweryById/BreweryInfoHeader.tsx (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/components/BreweryById/BreweryPostMap.tsx (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/components/BreweryIndex/BreweryCard.tsx (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/components/BreweryIndex/BreweryPostLikeButton.tsx (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/components/BreweryPost/CreateBreweryPostForm.tsx (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/components/Comments/CommentCardBody.tsx (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/components/Comments/CommentCardDropdown.tsx (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/components/Comments/CommentContentBody.tsx (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/components/Comments/CommentForm.tsx (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/components/Comments/CommentLoadingCardBody.tsx (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/components/Comments/CommentLoadingComponent.tsx (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/components/Comments/CommentsComponent.tsx (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/components/Comments/EditCommentBody.tsx (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/components/Comments/NoCommentsCard.tsx (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/components/Comments/types/index.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/components/CreateBeerPostForm.tsx (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/components/EditBeerPostForm.tsx (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/components/EditBreweryPostForm.tsx (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/components/Login/LoginForm.tsx (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/components/RegisterUserForm.tsx (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/components/UserPage/UserFollowButton.tsx (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/components/UserPage/UserHeader.tsx (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/components/ui/CustomToast.tsx (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/components/ui/Layout.tsx (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/components/ui/LikeButton.tsx (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/components/ui/LoadingCard.tsx (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/components/ui/LocationMarker.tsx (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/components/ui/Navbar.tsx (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/components/ui/SmLoadingCard.tsx (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/components/ui/Spinner.tsx (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/components/ui/forms/Button.tsx (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/components/ui/forms/FormError.tsx (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/components/ui/forms/FormInfo.tsx (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/components/ui/forms/FormLabel.tsx (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/components/ui/forms/FormPageLayout.tsx (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/components/ui/forms/FormSegment.tsx (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/components/ui/forms/FormSelect.tsx (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/components/ui/forms/FormTextArea.tsx (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/components/ui/forms/FormTextInput.tsx (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/components/ui/maps/ControlPanel.tsx (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/config/auth/cookie.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/config/auth/localStrat.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/config/auth/passwordFns.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/config/auth/session.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/config/auth/types.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/config/cloudinary/CloudinaryStorage.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/config/cloudinary/helpers/deleteImage.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/config/cloudinary/index.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/config/env/index.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/config/jwt/index.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/config/mapbox/geocoder.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/config/multer/uploadMiddleware.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/config/nextConnect/NextConnectOptions.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/config/nextConnect/middleware/getCurrentUser.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/config/nextConnect/middleware/validateRequest.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/config/pino/logger.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/config/sparkpost/sendEmail.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/config/util/ServerError.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/contexts/UserContext.tsx (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/controllers/comments/beer-comments/index.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/controllers/comments/beer-style-comments/index.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/controllers/comments/brewery-comments/index.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/controllers/comments/types/index.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/controllers/images/beer-images/index.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/controllers/images/brewery-images/index.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/controllers/images/types/index.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/controllers/likes/beer-posts-likes/index.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/controllers/likes/beer-style-likes/index.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/controllers/likes/brewery-post-likes/index.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/controllers/likes/types/index.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/controllers/posts/beer-posts/index.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/controllers/posts/beer-posts/types/index.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/controllers/posts/beer-styles/index.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/controllers/posts/beer-styles/types/index.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/controllers/posts/breweries/index.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/controllers/posts/breweries/types/index.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/controllers/posts/types/index.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/controllers/users/auth/index.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/controllers/users/auth/types/index.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/controllers/users/profile/index.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/controllers/users/profile/types/index.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/emails/ForgotEmail.tsx (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/emails/WelcomeEmail.tsx (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/hooks/auth/useConfirmUser.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/hooks/auth/useRedirectIfLoggedIn.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/hooks/auth/useUser.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/hooks/data-fetching/beer-comments/useBeerPostComments.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/hooks/data-fetching/beer-likes/useBeerPostLikeCount.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/hooks/data-fetching/beer-likes/useCheckIfUserLikesBeerPost.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/hooks/data-fetching/beer-posts/useBeerPostSearch.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/hooks/data-fetching/beer-posts/useBeerPosts.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/hooks/data-fetching/beer-posts/useBeerPostsByBeerStyles.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/hooks/data-fetching/beer-posts/useBeerPostsByBrewery.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/hooks/data-fetching/beer-posts/useBeerPostsByUser.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/hooks/data-fetching/beer-posts/useBeerRecommendations.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/hooks/data-fetching/beer-style-comments/useBeerStyleComments.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/hooks/data-fetching/beer-style-likes/useBeerStyleLikeCount.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/hooks/data-fetching/beer-style-likes/useCheckIfUserLikesBeerPost.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/hooks/data-fetching/beer-styles/useBeerStyles.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/hooks/data-fetching/brewery-comments/useBreweryPostComments.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/hooks/data-fetching/brewery-likes/useCheckIfUserLikesBreweryPost.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/hooks/data-fetching/brewery-likes/useGetBreweryPostLikeCount.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/hooks/data-fetching/brewery-posts/useBreweryMapPagePosts.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/hooks/data-fetching/brewery-posts/useBreweryPosts.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/hooks/data-fetching/brewery-posts/useBreweryPostsByUser.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/hooks/data-fetching/user-follows/useFollowStatus.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/hooks/data-fetching/user-follows/useGetUsersFollowedByUser.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/hooks/data-fetching/user-follows/useGetUsersFollowingUser.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/hooks/utilities/useGeolocation.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/hooks/utilities/useMediaQuery.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/hooks/utilities/useNavbar.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/hooks/utilities/useTheme.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/hooks/utilities/useTimeDistance.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/pages/404.tsx (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/pages/500.tsx (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/pages/_app.tsx (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/pages/_document.tsx (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/pages/api/beers/[postId]/comments/[commentId].ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/pages/api/beers/[postId]/comments/index.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/pages/api/beers/[postId]/images/index.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/pages/api/beers/[postId]/index.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/pages/api/beers/[postId]/like/index.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/pages/api/beers/[postId]/like/is-liked.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/pages/api/beers/[postId]/recommendations.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/pages/api/beers/create.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/pages/api/beers/index.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/pages/api/beers/search.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/pages/api/beers/styles/[postId]/beers/index.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/pages/api/beers/styles/[postId]/comments/[commentId].ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/pages/api/beers/styles/[postId]/comments/index.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/pages/api/beers/styles/[postId]/index.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/pages/api/beers/styles/[postId]/like/index.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/pages/api/beers/styles/[postId]/like/is-liked.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/pages/api/beers/styles/create.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/pages/api/beers/styles/index.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/pages/api/breweries/[postId]/beers/index.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/pages/api/breweries/[postId]/comments/[commentId].ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/pages/api/breweries/[postId]/comments/index.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/pages/api/breweries/[postId]/images/index.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/pages/api/breweries/[postId]/index.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/pages/api/breweries/[postId]/like/index.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/pages/api/breweries/[postId]/like/is-liked.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/pages/api/breweries/create.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/pages/api/breweries/index.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/pages/api/breweries/map/index.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/pages/api/users/[id]/follow-user.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/pages/api/users/[id]/followers.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/pages/api/users/[id]/following.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/pages/api/users/[id]/index.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/pages/api/users/[id]/is-followed.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/pages/api/users/[id]/posts/beers.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/pages/api/users/[id]/posts/breweries.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/pages/api/users/[id]/profile/update-avatar.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/pages/api/users/[id]/profile/update-profile.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/pages/api/users/check-email.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/pages/api/users/check-username.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/pages/api/users/confirm.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/pages/api/users/current.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/pages/api/users/edit-password.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/pages/api/users/forgot-password.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/pages/api/users/login.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/pages/api/users/logout.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/pages/api/users/register.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/pages/api/users/resend-confirmation.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/pages/beers/[id]/edit.tsx (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/pages/beers/[id]/index.tsx (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/pages/beers/index.tsx (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/pages/beers/search.tsx (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/pages/beers/styles/[id]/index.tsx (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/pages/beers/styles/index.tsx (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/pages/breweries/[id]/beers/create.tsx (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/pages/breweries/[id]/edit.tsx (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/pages/breweries/[id]/index.tsx (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/pages/breweries/create.tsx (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/pages/breweries/index.tsx (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/pages/breweries/map.tsx (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/pages/index.tsx (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/pages/login/index.tsx (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/pages/register/index.tsx (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/pages/users/[id].tsx (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/pages/users/account/edit-profile.tsx (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/pages/users/account/index.tsx (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/pages/users/confirm.tsx (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/pages/users/current.tsx (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/pages/users/forgot-password.tsx (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/pages/users/reset-password.tsx (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/prisma/DBClient.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/prisma/migrations/20230502225418_/migration.sql (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/prisma/migrations/20230510010306_/migration.sql (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/prisma/migrations/20230603010553_/migration.sql (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/prisma/migrations/20230918194402_/migration.sql (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/prisma/migrations/20230922054646_/migration.sql (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/prisma/migrations/20230923043953_/migration.sql (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/prisma/migrations/20231009153905_/migration.sql (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/prisma/migrations/20231106024511_/migration.sql (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/prisma/migrations/20231112221155_/migration.sql (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/prisma/migrations/migration_lock.toml (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/prisma/schema.prisma (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/prisma/seed/clear/clearCloudinaryStorage.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/prisma/seed/clear/clearDatabase.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/prisma/seed/clear/index.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/prisma/seed/create/createAdminUser.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/prisma/seed/create/createNewBeerImages.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/prisma/seed/create/createNewBeerPostComments.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/prisma/seed/create/createNewBeerPostLikes.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/prisma/seed/create/createNewBeerPosts.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/prisma/seed/create/createNewBeerStyleComments.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/prisma/seed/create/createNewBeerStyleLikes.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/prisma/seed/create/createNewBeerStyles.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/prisma/seed/create/createNewBreweryImages.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/prisma/seed/create/createNewBreweryPostComments.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/prisma/seed/create/createNewBreweryPostLikes.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/prisma/seed/create/createNewBreweryPosts.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/prisma/seed/create/createNewLocations.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/prisma/seed/create/createNewUserAvatars.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/prisma/seed/create/createNewUserFollows.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/prisma/seed/create/createNewUsers.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/prisma/seed/index.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/prisma/seed/util/beerStyles.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/prisma/seed/util/canadianCities.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/prisma/seed/util/imageUrls.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/reducers/accountPageReducer.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/requests/comments/beer-comment/index.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/requests/comments/beer-comment/types/index.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/requests/comments/beer-style-comment/index.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/requests/comments/beer-style-comment/types/index.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/requests/comments/brewery-comment/index.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/requests/comments/brewery-comment/sendCreateBreweryCommentRequest.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/requests/comments/brewery-comment/types/index.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/requests/images/beer-image/sendUploadBeerImageRequest.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/requests/images/brewery-image/sendUploadBreweryImageRequest.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/requests/likes/beer-post-like/sendBeerPostLikeRequest.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/requests/likes/beer-style-like/sendBeerStyleLikeRequest.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/requests/likes/brewery-post-like/sendBreweryPostLikeRequest.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/requests/posts/beer-post/index.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/requests/posts/beer-post/types/index.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/requests/posts/brewery-post/index.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/requests/posts/brewery-post/types/index.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/requests/users/auth/index.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/requests/users/auth/types/index.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/requests/users/profile/sendUpdateUserAvatarRequest.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/requests/users/profile/sendUpdateUserProfileRequest.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/requests/users/profile/validateUsernameRequest.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/services/comments/beer-comment/index.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/services/comments/beer-comment/types/index.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/services/comments/beer-style-comment/index.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/services/comments/beer-style-comment/types/index.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/services/comments/brewery-comment/index.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/services/comments/brewery-comment/types/index.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/services/images/beer-image/index.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/services/images/beer-image/types/index.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/services/images/brewery-image/index.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/services/images/brewery-image/types/index.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/services/likes/beer-post-like/index.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/services/likes/beer-post-like/schema/BeerPostLikeSchema.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/services/likes/beer-post-like/types/index.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/services/likes/beer-style-like/index.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/services/likes/beer-style-like/schema/BeerStyleLikeSchema.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/services/likes/beer-style-like/types/index.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/services/likes/brewery-post-like/index.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/services/likes/brewery-post-like/schema/BreweryPostLikeSchema.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/services/likes/brewery-post-like/types/index.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/services/posts/beer-post/index.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/services/posts/beer-post/schema/BeerPostQueryResult.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/services/posts/beer-post/schema/CreateBeerPostValidationSchema.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/services/posts/beer-post/schema/EditBeerPostValidationSchema.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/services/posts/beer-post/types/index.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/services/posts/beer-style-post/index.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/services/posts/beer-style-post/schema/BeerStyleQueryResult.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/services/posts/beer-style-post/schema/CreateBeerStyleValidationSchema.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/services/posts/beer-style-post/types/index.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/services/posts/brewery-post/index.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/services/posts/brewery-post/schema/BreweryPostMapQueryResult.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/services/posts/brewery-post/schema/BreweryPostQueryResult.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/services/posts/brewery-post/schema/CreateBreweryPostSchema.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/services/posts/brewery-post/schema/CreateNewBreweryPostWithoutLocationSchema.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/services/posts/brewery-post/schema/EditBreweryPostValidationSchema.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/services/posts/brewery-post/schema/GetMapBreweryPostsSchema.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/services/posts/brewery-post/types/index.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/services/schema/CommentSchema/CommentQueryResult.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/services/schema/CommentSchema/CreateCommentValidationSchema.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/services/schema/ImageSchema/ImageMetadataValidationSchema.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/services/schema/ImageSchema/ImageQueryValidationSchema.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/services/schema/ImageSchema/UploadImageValidationSchema.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/services/schema/PaginatedQueryResponseSchema.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/services/users/auth/index.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/services/users/auth/schema/CreateUserValidationSchemas.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/services/users/auth/schema/EditUserSchema.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/services/users/auth/schema/GetUserSchema.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/services/users/auth/schema/LoginValidationSchema.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/services/users/auth/schema/TokenValidationSchema.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/services/users/auth/schema/UpdateProfileSchema.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/services/users/auth/types/index.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/services/users/profile/index.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/services/users/profile/schema/FollowInfoSchema.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/services/users/profile/types/index.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/styles/globals.css (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/util/createErrorToast.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/util/withPageAuthRequired.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/src/validation/APIResponseValidationSchema.ts (100%) rename {src/Website-v1 => archive/next-js-web-app}/tailwind.config.js (100%) rename {src/Website-v1 => archive/next-js-web-app}/tsconfig.json (100%) rename {src/Website-v1 => archive/next-js-web-app}/vercel.json (100%) diff --git a/src/Website-v1/.eslintrc.json b/archive/next-js-web-app/.eslintrc.json similarity index 100% rename from src/Website-v1/.eslintrc.json rename to archive/next-js-web-app/.eslintrc.json diff --git a/src/Website-v1/.prettierignore b/archive/next-js-web-app/.prettierignore similarity index 100% rename from src/Website-v1/.prettierignore rename to archive/next-js-web-app/.prettierignore diff --git a/src/Website-v1/.prettierrc b/archive/next-js-web-app/.prettierrc similarity index 100% rename from src/Website-v1/.prettierrc rename to archive/next-js-web-app/.prettierrc diff --git a/src/Website-v1/README.old.md b/archive/next-js-web-app/README.old.md similarity index 100% rename from src/Website-v1/README.old.md rename to archive/next-js-web-app/README.old.md diff --git a/src/Website-v1/next.config.js b/archive/next-js-web-app/next.config.js similarity index 100% rename from src/Website-v1/next.config.js rename to archive/next-js-web-app/next.config.js diff --git a/src/Website-v1/package-lock.json b/archive/next-js-web-app/package-lock.json similarity index 100% rename from src/Website-v1/package-lock.json rename to archive/next-js-web-app/package-lock.json diff --git a/src/Website-v1/package.json b/archive/next-js-web-app/package.json similarity index 100% rename from src/Website-v1/package.json rename to archive/next-js-web-app/package.json diff --git a/src/Website-v1/postcss.config.js b/archive/next-js-web-app/postcss.config.js similarity index 100% rename from src/Website-v1/postcss.config.js rename to archive/next-js-web-app/postcss.config.js diff --git a/src/Website-v1/public/background.jpg b/archive/next-js-web-app/public/background.jpg similarity index 100% rename from src/Website-v1/public/background.jpg rename to archive/next-js-web-app/public/background.jpg diff --git a/src/Website-v1/public/favicon/about.txt b/archive/next-js-web-app/public/favicon/about.txt similarity index 100% rename from src/Website-v1/public/favicon/about.txt rename to archive/next-js-web-app/public/favicon/about.txt diff --git a/src/Website-v1/public/favicon/android-chrome-192x192.png b/archive/next-js-web-app/public/favicon/android-chrome-192x192.png similarity index 100% rename from src/Website-v1/public/favicon/android-chrome-192x192.png rename to archive/next-js-web-app/public/favicon/android-chrome-192x192.png diff --git a/src/Website-v1/public/favicon/android-chrome-512x512.png b/archive/next-js-web-app/public/favicon/android-chrome-512x512.png similarity index 100% rename from src/Website-v1/public/favicon/android-chrome-512x512.png rename to archive/next-js-web-app/public/favicon/android-chrome-512x512.png diff --git a/src/Website-v1/public/favicon/apple-touch-icon.png b/archive/next-js-web-app/public/favicon/apple-touch-icon.png similarity index 100% rename from src/Website-v1/public/favicon/apple-touch-icon.png rename to archive/next-js-web-app/public/favicon/apple-touch-icon.png diff --git a/src/Website-v1/public/favicon/favicon-16x16.png b/archive/next-js-web-app/public/favicon/favicon-16x16.png similarity index 100% rename from src/Website-v1/public/favicon/favicon-16x16.png rename to archive/next-js-web-app/public/favicon/favicon-16x16.png diff --git a/src/Website-v1/public/favicon/favicon-32x32.png b/archive/next-js-web-app/public/favicon/favicon-32x32.png similarity index 100% rename from src/Website-v1/public/favicon/favicon-32x32.png rename to archive/next-js-web-app/public/favicon/favicon-32x32.png diff --git a/src/Website-v1/public/favicon/favicon.ico b/archive/next-js-web-app/public/favicon/favicon.ico similarity index 100% rename from src/Website-v1/public/favicon/favicon.ico rename to archive/next-js-web-app/public/favicon/favicon.ico diff --git a/src/Website-v1/public/favicon/site.webmanifest b/archive/next-js-web-app/public/favicon/site.webmanifest similarity index 100% rename from src/Website-v1/public/favicon/site.webmanifest rename to archive/next-js-web-app/public/favicon/site.webmanifest diff --git a/src/Website-v1/public/robots.txt b/archive/next-js-web-app/public/robots.txt similarity index 100% rename from src/Website-v1/public/robots.txt rename to archive/next-js-web-app/public/robots.txt diff --git a/src/Website-v1/schema.svg b/archive/next-js-web-app/schema.svg similarity index 100% rename from src/Website-v1/schema.svg rename to archive/next-js-web-app/schema.svg diff --git a/src/Website-v1/src/components/Account/AccountInfo.tsx b/archive/next-js-web-app/src/components/Account/AccountInfo.tsx similarity index 100% rename from src/Website-v1/src/components/Account/AccountInfo.tsx rename to archive/next-js-web-app/src/components/Account/AccountInfo.tsx diff --git a/src/Website-v1/src/components/Account/BeerPostsByUser.tsx b/archive/next-js-web-app/src/components/Account/BeerPostsByUser.tsx similarity index 100% rename from src/Website-v1/src/components/Account/BeerPostsByUser.tsx rename to archive/next-js-web-app/src/components/Account/BeerPostsByUser.tsx diff --git a/src/Website-v1/src/components/Account/BreweryPostsByUser.tsx b/archive/next-js-web-app/src/components/Account/BreweryPostsByUser.tsx similarity index 100% rename from src/Website-v1/src/components/Account/BreweryPostsByUser.tsx rename to archive/next-js-web-app/src/components/Account/BreweryPostsByUser.tsx diff --git a/src/Website-v1/src/components/Account/DeleteAccount.tsx b/archive/next-js-web-app/src/components/Account/DeleteAccount.tsx similarity index 100% rename from src/Website-v1/src/components/Account/DeleteAccount.tsx rename to archive/next-js-web-app/src/components/Account/DeleteAccount.tsx diff --git a/src/Website-v1/src/components/Account/Security.tsx b/archive/next-js-web-app/src/components/Account/Security.tsx similarity index 100% rename from src/Website-v1/src/components/Account/Security.tsx rename to archive/next-js-web-app/src/components/Account/Security.tsx diff --git a/src/Website-v1/src/components/Account/UpdateProfileForm.tsx b/archive/next-js-web-app/src/components/Account/UpdateProfileForm.tsx similarity index 100% rename from src/Website-v1/src/components/Account/UpdateProfileForm.tsx rename to archive/next-js-web-app/src/components/Account/UpdateProfileForm.tsx diff --git a/src/Website-v1/src/components/Account/UpdateProfileLink.tsx b/archive/next-js-web-app/src/components/Account/UpdateProfileLink.tsx similarity index 100% rename from src/Website-v1/src/components/Account/UpdateProfileLink.tsx rename to archive/next-js-web-app/src/components/Account/UpdateProfileLink.tsx diff --git a/src/Website-v1/src/components/Account/UserAvatar.tsx b/archive/next-js-web-app/src/components/Account/UserAvatar.tsx similarity index 100% rename from src/Website-v1/src/components/Account/UserAvatar.tsx rename to archive/next-js-web-app/src/components/Account/UserAvatar.tsx diff --git a/src/Website-v1/src/components/Account/UserPosts.tsx b/archive/next-js-web-app/src/components/Account/UserPosts.tsx similarity index 100% rename from src/Website-v1/src/components/Account/UserPosts.tsx rename to archive/next-js-web-app/src/components/Account/UserPosts.tsx diff --git a/src/Website-v1/src/components/BeerById/BeerCommentForm.tsx b/archive/next-js-web-app/src/components/BeerById/BeerCommentForm.tsx similarity index 100% rename from src/Website-v1/src/components/BeerById/BeerCommentForm.tsx rename to archive/next-js-web-app/src/components/BeerById/BeerCommentForm.tsx diff --git a/src/Website-v1/src/components/BeerById/BeerInfoHeader.tsx b/archive/next-js-web-app/src/components/BeerById/BeerInfoHeader.tsx similarity index 100% rename from src/Website-v1/src/components/BeerById/BeerInfoHeader.tsx rename to archive/next-js-web-app/src/components/BeerById/BeerInfoHeader.tsx diff --git a/src/Website-v1/src/components/BeerById/BeerPostCommentsSection.tsx b/archive/next-js-web-app/src/components/BeerById/BeerPostCommentsSection.tsx similarity index 100% rename from src/Website-v1/src/components/BeerById/BeerPostCommentsSection.tsx rename to archive/next-js-web-app/src/components/BeerById/BeerPostCommentsSection.tsx diff --git a/src/Website-v1/src/components/BeerById/BeerPostLikeButton.tsx b/archive/next-js-web-app/src/components/BeerById/BeerPostLikeButton.tsx similarity index 100% rename from src/Website-v1/src/components/BeerById/BeerPostLikeButton.tsx rename to archive/next-js-web-app/src/components/BeerById/BeerPostLikeButton.tsx diff --git a/src/Website-v1/src/components/BeerById/BeerRecommendationLoadingComponent.tsx b/archive/next-js-web-app/src/components/BeerById/BeerRecommendationLoadingComponent.tsx similarity index 100% rename from src/Website-v1/src/components/BeerById/BeerRecommendationLoadingComponent.tsx rename to archive/next-js-web-app/src/components/BeerById/BeerRecommendationLoadingComponent.tsx diff --git a/src/Website-v1/src/components/BeerById/BeerRecommendations.tsx b/archive/next-js-web-app/src/components/BeerById/BeerRecommendations.tsx similarity index 100% rename from src/Website-v1/src/components/BeerById/BeerRecommendations.tsx rename to archive/next-js-web-app/src/components/BeerById/BeerRecommendations.tsx diff --git a/src/Website-v1/src/components/BeerIndex/BeerCard.tsx b/archive/next-js-web-app/src/components/BeerIndex/BeerCard.tsx similarity index 100% rename from src/Website-v1/src/components/BeerIndex/BeerCard.tsx rename to archive/next-js-web-app/src/components/BeerIndex/BeerCard.tsx diff --git a/src/Website-v1/src/components/BeerStyleById/BeerStyleBeerSection.tsx b/archive/next-js-web-app/src/components/BeerStyleById/BeerStyleBeerSection.tsx similarity index 100% rename from src/Website-v1/src/components/BeerStyleById/BeerStyleBeerSection.tsx rename to archive/next-js-web-app/src/components/BeerStyleById/BeerStyleBeerSection.tsx diff --git a/src/Website-v1/src/components/BeerStyleById/BeerStyleCommentForm.tsx b/archive/next-js-web-app/src/components/BeerStyleById/BeerStyleCommentForm.tsx similarity index 100% rename from src/Website-v1/src/components/BeerStyleById/BeerStyleCommentForm.tsx rename to archive/next-js-web-app/src/components/BeerStyleById/BeerStyleCommentForm.tsx diff --git a/src/Website-v1/src/components/BeerStyleById/BeerStyleCommentSection.tsx b/archive/next-js-web-app/src/components/BeerStyleById/BeerStyleCommentSection.tsx similarity index 100% rename from src/Website-v1/src/components/BeerStyleById/BeerStyleCommentSection.tsx rename to archive/next-js-web-app/src/components/BeerStyleById/BeerStyleCommentSection.tsx diff --git a/src/Website-v1/src/components/BeerStyleById/BeerStyleHeader.tsx b/archive/next-js-web-app/src/components/BeerStyleById/BeerStyleHeader.tsx similarity index 100% rename from src/Website-v1/src/components/BeerStyleById/BeerStyleHeader.tsx rename to archive/next-js-web-app/src/components/BeerStyleById/BeerStyleHeader.tsx diff --git a/src/Website-v1/src/components/BeerStyleById/BeerStyleLikeButton.tsx b/archive/next-js-web-app/src/components/BeerStyleById/BeerStyleLikeButton.tsx similarity index 100% rename from src/Website-v1/src/components/BeerStyleById/BeerStyleLikeButton.tsx rename to archive/next-js-web-app/src/components/BeerStyleById/BeerStyleLikeButton.tsx diff --git a/src/Website-v1/src/components/BeerStyleIndex/BeerStyleCard.tsx b/archive/next-js-web-app/src/components/BeerStyleIndex/BeerStyleCard.tsx similarity index 100% rename from src/Website-v1/src/components/BeerStyleIndex/BeerStyleCard.tsx rename to archive/next-js-web-app/src/components/BeerStyleIndex/BeerStyleCard.tsx diff --git a/src/Website-v1/src/components/BreweryById/BreweryBeerSection.tsx b/archive/next-js-web-app/src/components/BreweryById/BreweryBeerSection.tsx similarity index 100% rename from src/Website-v1/src/components/BreweryById/BreweryBeerSection.tsx rename to archive/next-js-web-app/src/components/BreweryById/BreweryBeerSection.tsx diff --git a/src/Website-v1/src/components/BreweryById/BreweryCommentForm.tsx b/archive/next-js-web-app/src/components/BreweryById/BreweryCommentForm.tsx similarity index 100% rename from src/Website-v1/src/components/BreweryById/BreweryCommentForm.tsx rename to archive/next-js-web-app/src/components/BreweryById/BreweryCommentForm.tsx diff --git a/src/Website-v1/src/components/BreweryById/BreweryCommentsSection.tsx b/archive/next-js-web-app/src/components/BreweryById/BreweryCommentsSection.tsx similarity index 100% rename from src/Website-v1/src/components/BreweryById/BreweryCommentsSection.tsx rename to archive/next-js-web-app/src/components/BreweryById/BreweryCommentsSection.tsx diff --git a/src/Website-v1/src/components/BreweryById/BreweryInfoHeader.tsx b/archive/next-js-web-app/src/components/BreweryById/BreweryInfoHeader.tsx similarity index 100% rename from src/Website-v1/src/components/BreweryById/BreweryInfoHeader.tsx rename to archive/next-js-web-app/src/components/BreweryById/BreweryInfoHeader.tsx diff --git a/src/Website-v1/src/components/BreweryById/BreweryPostMap.tsx b/archive/next-js-web-app/src/components/BreweryById/BreweryPostMap.tsx similarity index 100% rename from src/Website-v1/src/components/BreweryById/BreweryPostMap.tsx rename to archive/next-js-web-app/src/components/BreweryById/BreweryPostMap.tsx diff --git a/src/Website-v1/src/components/BreweryIndex/BreweryCard.tsx b/archive/next-js-web-app/src/components/BreweryIndex/BreweryCard.tsx similarity index 100% rename from src/Website-v1/src/components/BreweryIndex/BreweryCard.tsx rename to archive/next-js-web-app/src/components/BreweryIndex/BreweryCard.tsx diff --git a/src/Website-v1/src/components/BreweryIndex/BreweryPostLikeButton.tsx b/archive/next-js-web-app/src/components/BreweryIndex/BreweryPostLikeButton.tsx similarity index 100% rename from src/Website-v1/src/components/BreweryIndex/BreweryPostLikeButton.tsx rename to archive/next-js-web-app/src/components/BreweryIndex/BreweryPostLikeButton.tsx diff --git a/src/Website-v1/src/components/BreweryPost/CreateBreweryPostForm.tsx b/archive/next-js-web-app/src/components/BreweryPost/CreateBreweryPostForm.tsx similarity index 100% rename from src/Website-v1/src/components/BreweryPost/CreateBreweryPostForm.tsx rename to archive/next-js-web-app/src/components/BreweryPost/CreateBreweryPostForm.tsx diff --git a/src/Website-v1/src/components/Comments/CommentCardBody.tsx b/archive/next-js-web-app/src/components/Comments/CommentCardBody.tsx similarity index 100% rename from src/Website-v1/src/components/Comments/CommentCardBody.tsx rename to archive/next-js-web-app/src/components/Comments/CommentCardBody.tsx diff --git a/src/Website-v1/src/components/Comments/CommentCardDropdown.tsx b/archive/next-js-web-app/src/components/Comments/CommentCardDropdown.tsx similarity index 100% rename from src/Website-v1/src/components/Comments/CommentCardDropdown.tsx rename to archive/next-js-web-app/src/components/Comments/CommentCardDropdown.tsx diff --git a/src/Website-v1/src/components/Comments/CommentContentBody.tsx b/archive/next-js-web-app/src/components/Comments/CommentContentBody.tsx similarity index 100% rename from src/Website-v1/src/components/Comments/CommentContentBody.tsx rename to archive/next-js-web-app/src/components/Comments/CommentContentBody.tsx diff --git a/src/Website-v1/src/components/Comments/CommentForm.tsx b/archive/next-js-web-app/src/components/Comments/CommentForm.tsx similarity index 100% rename from src/Website-v1/src/components/Comments/CommentForm.tsx rename to archive/next-js-web-app/src/components/Comments/CommentForm.tsx diff --git a/src/Website-v1/src/components/Comments/CommentLoadingCardBody.tsx b/archive/next-js-web-app/src/components/Comments/CommentLoadingCardBody.tsx similarity index 100% rename from src/Website-v1/src/components/Comments/CommentLoadingCardBody.tsx rename to archive/next-js-web-app/src/components/Comments/CommentLoadingCardBody.tsx diff --git a/src/Website-v1/src/components/Comments/CommentLoadingComponent.tsx b/archive/next-js-web-app/src/components/Comments/CommentLoadingComponent.tsx similarity index 100% rename from src/Website-v1/src/components/Comments/CommentLoadingComponent.tsx rename to archive/next-js-web-app/src/components/Comments/CommentLoadingComponent.tsx diff --git a/src/Website-v1/src/components/Comments/CommentsComponent.tsx b/archive/next-js-web-app/src/components/Comments/CommentsComponent.tsx similarity index 100% rename from src/Website-v1/src/components/Comments/CommentsComponent.tsx rename to archive/next-js-web-app/src/components/Comments/CommentsComponent.tsx diff --git a/src/Website-v1/src/components/Comments/EditCommentBody.tsx b/archive/next-js-web-app/src/components/Comments/EditCommentBody.tsx similarity index 100% rename from src/Website-v1/src/components/Comments/EditCommentBody.tsx rename to archive/next-js-web-app/src/components/Comments/EditCommentBody.tsx diff --git a/src/Website-v1/src/components/Comments/NoCommentsCard.tsx b/archive/next-js-web-app/src/components/Comments/NoCommentsCard.tsx similarity index 100% rename from src/Website-v1/src/components/Comments/NoCommentsCard.tsx rename to archive/next-js-web-app/src/components/Comments/NoCommentsCard.tsx diff --git a/src/Website-v1/src/components/Comments/types/index.ts b/archive/next-js-web-app/src/components/Comments/types/index.ts similarity index 100% rename from src/Website-v1/src/components/Comments/types/index.ts rename to archive/next-js-web-app/src/components/Comments/types/index.ts diff --git a/src/Website-v1/src/components/CreateBeerPostForm.tsx b/archive/next-js-web-app/src/components/CreateBeerPostForm.tsx similarity index 100% rename from src/Website-v1/src/components/CreateBeerPostForm.tsx rename to archive/next-js-web-app/src/components/CreateBeerPostForm.tsx diff --git a/src/Website-v1/src/components/EditBeerPostForm.tsx b/archive/next-js-web-app/src/components/EditBeerPostForm.tsx similarity index 100% rename from src/Website-v1/src/components/EditBeerPostForm.tsx rename to archive/next-js-web-app/src/components/EditBeerPostForm.tsx diff --git a/src/Website-v1/src/components/EditBreweryPostForm.tsx b/archive/next-js-web-app/src/components/EditBreweryPostForm.tsx similarity index 100% rename from src/Website-v1/src/components/EditBreweryPostForm.tsx rename to archive/next-js-web-app/src/components/EditBreweryPostForm.tsx diff --git a/src/Website-v1/src/components/Login/LoginForm.tsx b/archive/next-js-web-app/src/components/Login/LoginForm.tsx similarity index 100% rename from src/Website-v1/src/components/Login/LoginForm.tsx rename to archive/next-js-web-app/src/components/Login/LoginForm.tsx diff --git a/src/Website-v1/src/components/RegisterUserForm.tsx b/archive/next-js-web-app/src/components/RegisterUserForm.tsx similarity index 100% rename from src/Website-v1/src/components/RegisterUserForm.tsx rename to archive/next-js-web-app/src/components/RegisterUserForm.tsx diff --git a/src/Website-v1/src/components/UserPage/UserFollowButton.tsx b/archive/next-js-web-app/src/components/UserPage/UserFollowButton.tsx similarity index 100% rename from src/Website-v1/src/components/UserPage/UserFollowButton.tsx rename to archive/next-js-web-app/src/components/UserPage/UserFollowButton.tsx diff --git a/src/Website-v1/src/components/UserPage/UserHeader.tsx b/archive/next-js-web-app/src/components/UserPage/UserHeader.tsx similarity index 100% rename from src/Website-v1/src/components/UserPage/UserHeader.tsx rename to archive/next-js-web-app/src/components/UserPage/UserHeader.tsx diff --git a/src/Website-v1/src/components/ui/CustomToast.tsx b/archive/next-js-web-app/src/components/ui/CustomToast.tsx similarity index 100% rename from src/Website-v1/src/components/ui/CustomToast.tsx rename to archive/next-js-web-app/src/components/ui/CustomToast.tsx diff --git a/src/Website-v1/src/components/ui/Layout.tsx b/archive/next-js-web-app/src/components/ui/Layout.tsx similarity index 100% rename from src/Website-v1/src/components/ui/Layout.tsx rename to archive/next-js-web-app/src/components/ui/Layout.tsx diff --git a/src/Website-v1/src/components/ui/LikeButton.tsx b/archive/next-js-web-app/src/components/ui/LikeButton.tsx similarity index 100% rename from src/Website-v1/src/components/ui/LikeButton.tsx rename to archive/next-js-web-app/src/components/ui/LikeButton.tsx diff --git a/src/Website-v1/src/components/ui/LoadingCard.tsx b/archive/next-js-web-app/src/components/ui/LoadingCard.tsx similarity index 100% rename from src/Website-v1/src/components/ui/LoadingCard.tsx rename to archive/next-js-web-app/src/components/ui/LoadingCard.tsx diff --git a/src/Website-v1/src/components/ui/LocationMarker.tsx b/archive/next-js-web-app/src/components/ui/LocationMarker.tsx similarity index 100% rename from src/Website-v1/src/components/ui/LocationMarker.tsx rename to archive/next-js-web-app/src/components/ui/LocationMarker.tsx diff --git a/src/Website-v1/src/components/ui/Navbar.tsx b/archive/next-js-web-app/src/components/ui/Navbar.tsx similarity index 100% rename from src/Website-v1/src/components/ui/Navbar.tsx rename to archive/next-js-web-app/src/components/ui/Navbar.tsx diff --git a/src/Website-v1/src/components/ui/SmLoadingCard.tsx b/archive/next-js-web-app/src/components/ui/SmLoadingCard.tsx similarity index 100% rename from src/Website-v1/src/components/ui/SmLoadingCard.tsx rename to archive/next-js-web-app/src/components/ui/SmLoadingCard.tsx diff --git a/src/Website-v1/src/components/ui/Spinner.tsx b/archive/next-js-web-app/src/components/ui/Spinner.tsx similarity index 100% rename from src/Website-v1/src/components/ui/Spinner.tsx rename to archive/next-js-web-app/src/components/ui/Spinner.tsx diff --git a/src/Website-v1/src/components/ui/forms/Button.tsx b/archive/next-js-web-app/src/components/ui/forms/Button.tsx similarity index 100% rename from src/Website-v1/src/components/ui/forms/Button.tsx rename to archive/next-js-web-app/src/components/ui/forms/Button.tsx diff --git a/src/Website-v1/src/components/ui/forms/FormError.tsx b/archive/next-js-web-app/src/components/ui/forms/FormError.tsx similarity index 100% rename from src/Website-v1/src/components/ui/forms/FormError.tsx rename to archive/next-js-web-app/src/components/ui/forms/FormError.tsx diff --git a/src/Website-v1/src/components/ui/forms/FormInfo.tsx b/archive/next-js-web-app/src/components/ui/forms/FormInfo.tsx similarity index 100% rename from src/Website-v1/src/components/ui/forms/FormInfo.tsx rename to archive/next-js-web-app/src/components/ui/forms/FormInfo.tsx diff --git a/src/Website-v1/src/components/ui/forms/FormLabel.tsx b/archive/next-js-web-app/src/components/ui/forms/FormLabel.tsx similarity index 100% rename from src/Website-v1/src/components/ui/forms/FormLabel.tsx rename to archive/next-js-web-app/src/components/ui/forms/FormLabel.tsx diff --git a/src/Website-v1/src/components/ui/forms/FormPageLayout.tsx b/archive/next-js-web-app/src/components/ui/forms/FormPageLayout.tsx similarity index 100% rename from src/Website-v1/src/components/ui/forms/FormPageLayout.tsx rename to archive/next-js-web-app/src/components/ui/forms/FormPageLayout.tsx diff --git a/src/Website-v1/src/components/ui/forms/FormSegment.tsx b/archive/next-js-web-app/src/components/ui/forms/FormSegment.tsx similarity index 100% rename from src/Website-v1/src/components/ui/forms/FormSegment.tsx rename to archive/next-js-web-app/src/components/ui/forms/FormSegment.tsx diff --git a/src/Website-v1/src/components/ui/forms/FormSelect.tsx b/archive/next-js-web-app/src/components/ui/forms/FormSelect.tsx similarity index 100% rename from src/Website-v1/src/components/ui/forms/FormSelect.tsx rename to archive/next-js-web-app/src/components/ui/forms/FormSelect.tsx diff --git a/src/Website-v1/src/components/ui/forms/FormTextArea.tsx b/archive/next-js-web-app/src/components/ui/forms/FormTextArea.tsx similarity index 100% rename from src/Website-v1/src/components/ui/forms/FormTextArea.tsx rename to archive/next-js-web-app/src/components/ui/forms/FormTextArea.tsx diff --git a/src/Website-v1/src/components/ui/forms/FormTextInput.tsx b/archive/next-js-web-app/src/components/ui/forms/FormTextInput.tsx similarity index 100% rename from src/Website-v1/src/components/ui/forms/FormTextInput.tsx rename to archive/next-js-web-app/src/components/ui/forms/FormTextInput.tsx diff --git a/src/Website-v1/src/components/ui/maps/ControlPanel.tsx b/archive/next-js-web-app/src/components/ui/maps/ControlPanel.tsx similarity index 100% rename from src/Website-v1/src/components/ui/maps/ControlPanel.tsx rename to archive/next-js-web-app/src/components/ui/maps/ControlPanel.tsx diff --git a/src/Website-v1/src/config/auth/cookie.ts b/archive/next-js-web-app/src/config/auth/cookie.ts similarity index 100% rename from src/Website-v1/src/config/auth/cookie.ts rename to archive/next-js-web-app/src/config/auth/cookie.ts diff --git a/src/Website-v1/src/config/auth/localStrat.ts b/archive/next-js-web-app/src/config/auth/localStrat.ts similarity index 100% rename from src/Website-v1/src/config/auth/localStrat.ts rename to archive/next-js-web-app/src/config/auth/localStrat.ts diff --git a/src/Website-v1/src/config/auth/passwordFns.ts b/archive/next-js-web-app/src/config/auth/passwordFns.ts similarity index 100% rename from src/Website-v1/src/config/auth/passwordFns.ts rename to archive/next-js-web-app/src/config/auth/passwordFns.ts diff --git a/src/Website-v1/src/config/auth/session.ts b/archive/next-js-web-app/src/config/auth/session.ts similarity index 100% rename from src/Website-v1/src/config/auth/session.ts rename to archive/next-js-web-app/src/config/auth/session.ts diff --git a/src/Website-v1/src/config/auth/types.ts b/archive/next-js-web-app/src/config/auth/types.ts similarity index 100% rename from src/Website-v1/src/config/auth/types.ts rename to archive/next-js-web-app/src/config/auth/types.ts diff --git a/src/Website-v1/src/config/cloudinary/CloudinaryStorage.ts b/archive/next-js-web-app/src/config/cloudinary/CloudinaryStorage.ts similarity index 100% rename from src/Website-v1/src/config/cloudinary/CloudinaryStorage.ts rename to archive/next-js-web-app/src/config/cloudinary/CloudinaryStorage.ts diff --git a/src/Website-v1/src/config/cloudinary/helpers/deleteImage.ts b/archive/next-js-web-app/src/config/cloudinary/helpers/deleteImage.ts similarity index 100% rename from src/Website-v1/src/config/cloudinary/helpers/deleteImage.ts rename to archive/next-js-web-app/src/config/cloudinary/helpers/deleteImage.ts diff --git a/src/Website-v1/src/config/cloudinary/index.ts b/archive/next-js-web-app/src/config/cloudinary/index.ts similarity index 100% rename from src/Website-v1/src/config/cloudinary/index.ts rename to archive/next-js-web-app/src/config/cloudinary/index.ts diff --git a/src/Website-v1/src/config/env/index.ts b/archive/next-js-web-app/src/config/env/index.ts similarity index 100% rename from src/Website-v1/src/config/env/index.ts rename to archive/next-js-web-app/src/config/env/index.ts diff --git a/src/Website-v1/src/config/jwt/index.ts b/archive/next-js-web-app/src/config/jwt/index.ts similarity index 100% rename from src/Website-v1/src/config/jwt/index.ts rename to archive/next-js-web-app/src/config/jwt/index.ts diff --git a/src/Website-v1/src/config/mapbox/geocoder.ts b/archive/next-js-web-app/src/config/mapbox/geocoder.ts similarity index 100% rename from src/Website-v1/src/config/mapbox/geocoder.ts rename to archive/next-js-web-app/src/config/mapbox/geocoder.ts diff --git a/src/Website-v1/src/config/multer/uploadMiddleware.ts b/archive/next-js-web-app/src/config/multer/uploadMiddleware.ts similarity index 100% rename from src/Website-v1/src/config/multer/uploadMiddleware.ts rename to archive/next-js-web-app/src/config/multer/uploadMiddleware.ts diff --git a/src/Website-v1/src/config/nextConnect/NextConnectOptions.ts b/archive/next-js-web-app/src/config/nextConnect/NextConnectOptions.ts similarity index 100% rename from src/Website-v1/src/config/nextConnect/NextConnectOptions.ts rename to archive/next-js-web-app/src/config/nextConnect/NextConnectOptions.ts diff --git a/src/Website-v1/src/config/nextConnect/middleware/getCurrentUser.ts b/archive/next-js-web-app/src/config/nextConnect/middleware/getCurrentUser.ts similarity index 100% rename from src/Website-v1/src/config/nextConnect/middleware/getCurrentUser.ts rename to archive/next-js-web-app/src/config/nextConnect/middleware/getCurrentUser.ts diff --git a/src/Website-v1/src/config/nextConnect/middleware/validateRequest.ts b/archive/next-js-web-app/src/config/nextConnect/middleware/validateRequest.ts similarity index 100% rename from src/Website-v1/src/config/nextConnect/middleware/validateRequest.ts rename to archive/next-js-web-app/src/config/nextConnect/middleware/validateRequest.ts diff --git a/src/Website-v1/src/config/pino/logger.ts b/archive/next-js-web-app/src/config/pino/logger.ts similarity index 100% rename from src/Website-v1/src/config/pino/logger.ts rename to archive/next-js-web-app/src/config/pino/logger.ts diff --git a/src/Website-v1/src/config/sparkpost/sendEmail.ts b/archive/next-js-web-app/src/config/sparkpost/sendEmail.ts similarity index 100% rename from src/Website-v1/src/config/sparkpost/sendEmail.ts rename to archive/next-js-web-app/src/config/sparkpost/sendEmail.ts diff --git a/src/Website-v1/src/config/util/ServerError.ts b/archive/next-js-web-app/src/config/util/ServerError.ts similarity index 100% rename from src/Website-v1/src/config/util/ServerError.ts rename to archive/next-js-web-app/src/config/util/ServerError.ts diff --git a/src/Website-v1/src/contexts/UserContext.tsx b/archive/next-js-web-app/src/contexts/UserContext.tsx similarity index 100% rename from src/Website-v1/src/contexts/UserContext.tsx rename to archive/next-js-web-app/src/contexts/UserContext.tsx diff --git a/src/Website-v1/src/controllers/comments/beer-comments/index.ts b/archive/next-js-web-app/src/controllers/comments/beer-comments/index.ts similarity index 100% rename from src/Website-v1/src/controllers/comments/beer-comments/index.ts rename to archive/next-js-web-app/src/controllers/comments/beer-comments/index.ts diff --git a/src/Website-v1/src/controllers/comments/beer-style-comments/index.ts b/archive/next-js-web-app/src/controllers/comments/beer-style-comments/index.ts similarity index 100% rename from src/Website-v1/src/controllers/comments/beer-style-comments/index.ts rename to archive/next-js-web-app/src/controllers/comments/beer-style-comments/index.ts diff --git a/src/Website-v1/src/controllers/comments/brewery-comments/index.ts b/archive/next-js-web-app/src/controllers/comments/brewery-comments/index.ts similarity index 100% rename from src/Website-v1/src/controllers/comments/brewery-comments/index.ts rename to archive/next-js-web-app/src/controllers/comments/brewery-comments/index.ts diff --git a/src/Website-v1/src/controllers/comments/types/index.ts b/archive/next-js-web-app/src/controllers/comments/types/index.ts similarity index 100% rename from src/Website-v1/src/controllers/comments/types/index.ts rename to archive/next-js-web-app/src/controllers/comments/types/index.ts diff --git a/src/Website-v1/src/controllers/images/beer-images/index.ts b/archive/next-js-web-app/src/controllers/images/beer-images/index.ts similarity index 100% rename from src/Website-v1/src/controllers/images/beer-images/index.ts rename to archive/next-js-web-app/src/controllers/images/beer-images/index.ts diff --git a/src/Website-v1/src/controllers/images/brewery-images/index.ts b/archive/next-js-web-app/src/controllers/images/brewery-images/index.ts similarity index 100% rename from src/Website-v1/src/controllers/images/brewery-images/index.ts rename to archive/next-js-web-app/src/controllers/images/brewery-images/index.ts diff --git a/src/Website-v1/src/controllers/images/types/index.ts b/archive/next-js-web-app/src/controllers/images/types/index.ts similarity index 100% rename from src/Website-v1/src/controllers/images/types/index.ts rename to archive/next-js-web-app/src/controllers/images/types/index.ts diff --git a/src/Website-v1/src/controllers/likes/beer-posts-likes/index.ts b/archive/next-js-web-app/src/controllers/likes/beer-posts-likes/index.ts similarity index 100% rename from src/Website-v1/src/controllers/likes/beer-posts-likes/index.ts rename to archive/next-js-web-app/src/controllers/likes/beer-posts-likes/index.ts diff --git a/src/Website-v1/src/controllers/likes/beer-style-likes/index.ts b/archive/next-js-web-app/src/controllers/likes/beer-style-likes/index.ts similarity index 100% rename from src/Website-v1/src/controllers/likes/beer-style-likes/index.ts rename to archive/next-js-web-app/src/controllers/likes/beer-style-likes/index.ts diff --git a/src/Website-v1/src/controllers/likes/brewery-post-likes/index.ts b/archive/next-js-web-app/src/controllers/likes/brewery-post-likes/index.ts similarity index 100% rename from src/Website-v1/src/controllers/likes/brewery-post-likes/index.ts rename to archive/next-js-web-app/src/controllers/likes/brewery-post-likes/index.ts diff --git a/src/Website-v1/src/controllers/likes/types/index.ts b/archive/next-js-web-app/src/controllers/likes/types/index.ts similarity index 100% rename from src/Website-v1/src/controllers/likes/types/index.ts rename to archive/next-js-web-app/src/controllers/likes/types/index.ts diff --git a/src/Website-v1/src/controllers/posts/beer-posts/index.ts b/archive/next-js-web-app/src/controllers/posts/beer-posts/index.ts similarity index 100% rename from src/Website-v1/src/controllers/posts/beer-posts/index.ts rename to archive/next-js-web-app/src/controllers/posts/beer-posts/index.ts diff --git a/src/Website-v1/src/controllers/posts/beer-posts/types/index.ts b/archive/next-js-web-app/src/controllers/posts/beer-posts/types/index.ts similarity index 100% rename from src/Website-v1/src/controllers/posts/beer-posts/types/index.ts rename to archive/next-js-web-app/src/controllers/posts/beer-posts/types/index.ts diff --git a/src/Website-v1/src/controllers/posts/beer-styles/index.ts b/archive/next-js-web-app/src/controllers/posts/beer-styles/index.ts similarity index 100% rename from src/Website-v1/src/controllers/posts/beer-styles/index.ts rename to archive/next-js-web-app/src/controllers/posts/beer-styles/index.ts diff --git a/src/Website-v1/src/controllers/posts/beer-styles/types/index.ts b/archive/next-js-web-app/src/controllers/posts/beer-styles/types/index.ts similarity index 100% rename from src/Website-v1/src/controllers/posts/beer-styles/types/index.ts rename to archive/next-js-web-app/src/controllers/posts/beer-styles/types/index.ts diff --git a/src/Website-v1/src/controllers/posts/breweries/index.ts b/archive/next-js-web-app/src/controllers/posts/breweries/index.ts similarity index 100% rename from src/Website-v1/src/controllers/posts/breweries/index.ts rename to archive/next-js-web-app/src/controllers/posts/breweries/index.ts diff --git a/src/Website-v1/src/controllers/posts/breweries/types/index.ts b/archive/next-js-web-app/src/controllers/posts/breweries/types/index.ts similarity index 100% rename from src/Website-v1/src/controllers/posts/breweries/types/index.ts rename to archive/next-js-web-app/src/controllers/posts/breweries/types/index.ts diff --git a/src/Website-v1/src/controllers/posts/types/index.ts b/archive/next-js-web-app/src/controllers/posts/types/index.ts similarity index 100% rename from src/Website-v1/src/controllers/posts/types/index.ts rename to archive/next-js-web-app/src/controllers/posts/types/index.ts diff --git a/src/Website-v1/src/controllers/users/auth/index.ts b/archive/next-js-web-app/src/controllers/users/auth/index.ts similarity index 100% rename from src/Website-v1/src/controllers/users/auth/index.ts rename to archive/next-js-web-app/src/controllers/users/auth/index.ts diff --git a/src/Website-v1/src/controllers/users/auth/types/index.ts b/archive/next-js-web-app/src/controllers/users/auth/types/index.ts similarity index 100% rename from src/Website-v1/src/controllers/users/auth/types/index.ts rename to archive/next-js-web-app/src/controllers/users/auth/types/index.ts diff --git a/src/Website-v1/src/controllers/users/profile/index.ts b/archive/next-js-web-app/src/controllers/users/profile/index.ts similarity index 100% rename from src/Website-v1/src/controllers/users/profile/index.ts rename to archive/next-js-web-app/src/controllers/users/profile/index.ts diff --git a/src/Website-v1/src/controllers/users/profile/types/index.ts b/archive/next-js-web-app/src/controllers/users/profile/types/index.ts similarity index 100% rename from src/Website-v1/src/controllers/users/profile/types/index.ts rename to archive/next-js-web-app/src/controllers/users/profile/types/index.ts diff --git a/src/Website-v1/src/emails/ForgotEmail.tsx b/archive/next-js-web-app/src/emails/ForgotEmail.tsx similarity index 100% rename from src/Website-v1/src/emails/ForgotEmail.tsx rename to archive/next-js-web-app/src/emails/ForgotEmail.tsx diff --git a/src/Website-v1/src/emails/WelcomeEmail.tsx b/archive/next-js-web-app/src/emails/WelcomeEmail.tsx similarity index 100% rename from src/Website-v1/src/emails/WelcomeEmail.tsx rename to archive/next-js-web-app/src/emails/WelcomeEmail.tsx diff --git a/src/Website-v1/src/hooks/auth/useConfirmUser.ts b/archive/next-js-web-app/src/hooks/auth/useConfirmUser.ts similarity index 100% rename from src/Website-v1/src/hooks/auth/useConfirmUser.ts rename to archive/next-js-web-app/src/hooks/auth/useConfirmUser.ts diff --git a/src/Website-v1/src/hooks/auth/useRedirectIfLoggedIn.ts b/archive/next-js-web-app/src/hooks/auth/useRedirectIfLoggedIn.ts similarity index 100% rename from src/Website-v1/src/hooks/auth/useRedirectIfLoggedIn.ts rename to archive/next-js-web-app/src/hooks/auth/useRedirectIfLoggedIn.ts diff --git a/src/Website-v1/src/hooks/auth/useUser.ts b/archive/next-js-web-app/src/hooks/auth/useUser.ts similarity index 100% rename from src/Website-v1/src/hooks/auth/useUser.ts rename to archive/next-js-web-app/src/hooks/auth/useUser.ts diff --git a/src/Website-v1/src/hooks/data-fetching/beer-comments/useBeerPostComments.ts b/archive/next-js-web-app/src/hooks/data-fetching/beer-comments/useBeerPostComments.ts similarity index 100% rename from src/Website-v1/src/hooks/data-fetching/beer-comments/useBeerPostComments.ts rename to archive/next-js-web-app/src/hooks/data-fetching/beer-comments/useBeerPostComments.ts diff --git a/src/Website-v1/src/hooks/data-fetching/beer-likes/useBeerPostLikeCount.ts b/archive/next-js-web-app/src/hooks/data-fetching/beer-likes/useBeerPostLikeCount.ts similarity index 100% rename from src/Website-v1/src/hooks/data-fetching/beer-likes/useBeerPostLikeCount.ts rename to archive/next-js-web-app/src/hooks/data-fetching/beer-likes/useBeerPostLikeCount.ts diff --git a/src/Website-v1/src/hooks/data-fetching/beer-likes/useCheckIfUserLikesBeerPost.ts b/archive/next-js-web-app/src/hooks/data-fetching/beer-likes/useCheckIfUserLikesBeerPost.ts similarity index 100% rename from src/Website-v1/src/hooks/data-fetching/beer-likes/useCheckIfUserLikesBeerPost.ts rename to archive/next-js-web-app/src/hooks/data-fetching/beer-likes/useCheckIfUserLikesBeerPost.ts diff --git a/src/Website-v1/src/hooks/data-fetching/beer-posts/useBeerPostSearch.ts b/archive/next-js-web-app/src/hooks/data-fetching/beer-posts/useBeerPostSearch.ts similarity index 100% rename from src/Website-v1/src/hooks/data-fetching/beer-posts/useBeerPostSearch.ts rename to archive/next-js-web-app/src/hooks/data-fetching/beer-posts/useBeerPostSearch.ts diff --git a/src/Website-v1/src/hooks/data-fetching/beer-posts/useBeerPosts.ts b/archive/next-js-web-app/src/hooks/data-fetching/beer-posts/useBeerPosts.ts similarity index 100% rename from src/Website-v1/src/hooks/data-fetching/beer-posts/useBeerPosts.ts rename to archive/next-js-web-app/src/hooks/data-fetching/beer-posts/useBeerPosts.ts diff --git a/src/Website-v1/src/hooks/data-fetching/beer-posts/useBeerPostsByBeerStyles.ts b/archive/next-js-web-app/src/hooks/data-fetching/beer-posts/useBeerPostsByBeerStyles.ts similarity index 100% rename from src/Website-v1/src/hooks/data-fetching/beer-posts/useBeerPostsByBeerStyles.ts rename to archive/next-js-web-app/src/hooks/data-fetching/beer-posts/useBeerPostsByBeerStyles.ts diff --git a/src/Website-v1/src/hooks/data-fetching/beer-posts/useBeerPostsByBrewery.ts b/archive/next-js-web-app/src/hooks/data-fetching/beer-posts/useBeerPostsByBrewery.ts similarity index 100% rename from src/Website-v1/src/hooks/data-fetching/beer-posts/useBeerPostsByBrewery.ts rename to archive/next-js-web-app/src/hooks/data-fetching/beer-posts/useBeerPostsByBrewery.ts diff --git a/src/Website-v1/src/hooks/data-fetching/beer-posts/useBeerPostsByUser.ts b/archive/next-js-web-app/src/hooks/data-fetching/beer-posts/useBeerPostsByUser.ts similarity index 100% rename from src/Website-v1/src/hooks/data-fetching/beer-posts/useBeerPostsByUser.ts rename to archive/next-js-web-app/src/hooks/data-fetching/beer-posts/useBeerPostsByUser.ts diff --git a/src/Website-v1/src/hooks/data-fetching/beer-posts/useBeerRecommendations.ts b/archive/next-js-web-app/src/hooks/data-fetching/beer-posts/useBeerRecommendations.ts similarity index 100% rename from src/Website-v1/src/hooks/data-fetching/beer-posts/useBeerRecommendations.ts rename to archive/next-js-web-app/src/hooks/data-fetching/beer-posts/useBeerRecommendations.ts diff --git a/src/Website-v1/src/hooks/data-fetching/beer-style-comments/useBeerStyleComments.ts b/archive/next-js-web-app/src/hooks/data-fetching/beer-style-comments/useBeerStyleComments.ts similarity index 100% rename from src/Website-v1/src/hooks/data-fetching/beer-style-comments/useBeerStyleComments.ts rename to archive/next-js-web-app/src/hooks/data-fetching/beer-style-comments/useBeerStyleComments.ts diff --git a/src/Website-v1/src/hooks/data-fetching/beer-style-likes/useBeerStyleLikeCount.ts b/archive/next-js-web-app/src/hooks/data-fetching/beer-style-likes/useBeerStyleLikeCount.ts similarity index 100% rename from src/Website-v1/src/hooks/data-fetching/beer-style-likes/useBeerStyleLikeCount.ts rename to archive/next-js-web-app/src/hooks/data-fetching/beer-style-likes/useBeerStyleLikeCount.ts diff --git a/src/Website-v1/src/hooks/data-fetching/beer-style-likes/useCheckIfUserLikesBeerPost.ts b/archive/next-js-web-app/src/hooks/data-fetching/beer-style-likes/useCheckIfUserLikesBeerPost.ts similarity index 100% rename from src/Website-v1/src/hooks/data-fetching/beer-style-likes/useCheckIfUserLikesBeerPost.ts rename to archive/next-js-web-app/src/hooks/data-fetching/beer-style-likes/useCheckIfUserLikesBeerPost.ts diff --git a/src/Website-v1/src/hooks/data-fetching/beer-styles/useBeerStyles.ts b/archive/next-js-web-app/src/hooks/data-fetching/beer-styles/useBeerStyles.ts similarity index 100% rename from src/Website-v1/src/hooks/data-fetching/beer-styles/useBeerStyles.ts rename to archive/next-js-web-app/src/hooks/data-fetching/beer-styles/useBeerStyles.ts diff --git a/src/Website-v1/src/hooks/data-fetching/brewery-comments/useBreweryPostComments.ts b/archive/next-js-web-app/src/hooks/data-fetching/brewery-comments/useBreweryPostComments.ts similarity index 100% rename from src/Website-v1/src/hooks/data-fetching/brewery-comments/useBreweryPostComments.ts rename to archive/next-js-web-app/src/hooks/data-fetching/brewery-comments/useBreweryPostComments.ts diff --git a/src/Website-v1/src/hooks/data-fetching/brewery-likes/useCheckIfUserLikesBreweryPost.ts b/archive/next-js-web-app/src/hooks/data-fetching/brewery-likes/useCheckIfUserLikesBreweryPost.ts similarity index 100% rename from src/Website-v1/src/hooks/data-fetching/brewery-likes/useCheckIfUserLikesBreweryPost.ts rename to archive/next-js-web-app/src/hooks/data-fetching/brewery-likes/useCheckIfUserLikesBreweryPost.ts diff --git a/src/Website-v1/src/hooks/data-fetching/brewery-likes/useGetBreweryPostLikeCount.ts b/archive/next-js-web-app/src/hooks/data-fetching/brewery-likes/useGetBreweryPostLikeCount.ts similarity index 100% rename from src/Website-v1/src/hooks/data-fetching/brewery-likes/useGetBreweryPostLikeCount.ts rename to archive/next-js-web-app/src/hooks/data-fetching/brewery-likes/useGetBreweryPostLikeCount.ts diff --git a/src/Website-v1/src/hooks/data-fetching/brewery-posts/useBreweryMapPagePosts.ts b/archive/next-js-web-app/src/hooks/data-fetching/brewery-posts/useBreweryMapPagePosts.ts similarity index 100% rename from src/Website-v1/src/hooks/data-fetching/brewery-posts/useBreweryMapPagePosts.ts rename to archive/next-js-web-app/src/hooks/data-fetching/brewery-posts/useBreweryMapPagePosts.ts diff --git a/src/Website-v1/src/hooks/data-fetching/brewery-posts/useBreweryPosts.ts b/archive/next-js-web-app/src/hooks/data-fetching/brewery-posts/useBreweryPosts.ts similarity index 100% rename from src/Website-v1/src/hooks/data-fetching/brewery-posts/useBreweryPosts.ts rename to archive/next-js-web-app/src/hooks/data-fetching/brewery-posts/useBreweryPosts.ts diff --git a/src/Website-v1/src/hooks/data-fetching/brewery-posts/useBreweryPostsByUser.ts b/archive/next-js-web-app/src/hooks/data-fetching/brewery-posts/useBreweryPostsByUser.ts similarity index 100% rename from src/Website-v1/src/hooks/data-fetching/brewery-posts/useBreweryPostsByUser.ts rename to archive/next-js-web-app/src/hooks/data-fetching/brewery-posts/useBreweryPostsByUser.ts diff --git a/src/Website-v1/src/hooks/data-fetching/user-follows/useFollowStatus.ts b/archive/next-js-web-app/src/hooks/data-fetching/user-follows/useFollowStatus.ts similarity index 100% rename from src/Website-v1/src/hooks/data-fetching/user-follows/useFollowStatus.ts rename to archive/next-js-web-app/src/hooks/data-fetching/user-follows/useFollowStatus.ts diff --git a/src/Website-v1/src/hooks/data-fetching/user-follows/useGetUsersFollowedByUser.ts b/archive/next-js-web-app/src/hooks/data-fetching/user-follows/useGetUsersFollowedByUser.ts similarity index 100% rename from src/Website-v1/src/hooks/data-fetching/user-follows/useGetUsersFollowedByUser.ts rename to archive/next-js-web-app/src/hooks/data-fetching/user-follows/useGetUsersFollowedByUser.ts diff --git a/src/Website-v1/src/hooks/data-fetching/user-follows/useGetUsersFollowingUser.ts b/archive/next-js-web-app/src/hooks/data-fetching/user-follows/useGetUsersFollowingUser.ts similarity index 100% rename from src/Website-v1/src/hooks/data-fetching/user-follows/useGetUsersFollowingUser.ts rename to archive/next-js-web-app/src/hooks/data-fetching/user-follows/useGetUsersFollowingUser.ts diff --git a/src/Website-v1/src/hooks/utilities/useGeolocation.ts b/archive/next-js-web-app/src/hooks/utilities/useGeolocation.ts similarity index 100% rename from src/Website-v1/src/hooks/utilities/useGeolocation.ts rename to archive/next-js-web-app/src/hooks/utilities/useGeolocation.ts diff --git a/src/Website-v1/src/hooks/utilities/useMediaQuery.ts b/archive/next-js-web-app/src/hooks/utilities/useMediaQuery.ts similarity index 100% rename from src/Website-v1/src/hooks/utilities/useMediaQuery.ts rename to archive/next-js-web-app/src/hooks/utilities/useMediaQuery.ts diff --git a/src/Website-v1/src/hooks/utilities/useNavbar.ts b/archive/next-js-web-app/src/hooks/utilities/useNavbar.ts similarity index 100% rename from src/Website-v1/src/hooks/utilities/useNavbar.ts rename to archive/next-js-web-app/src/hooks/utilities/useNavbar.ts diff --git a/src/Website-v1/src/hooks/utilities/useTheme.ts b/archive/next-js-web-app/src/hooks/utilities/useTheme.ts similarity index 100% rename from src/Website-v1/src/hooks/utilities/useTheme.ts rename to archive/next-js-web-app/src/hooks/utilities/useTheme.ts diff --git a/src/Website-v1/src/hooks/utilities/useTimeDistance.ts b/archive/next-js-web-app/src/hooks/utilities/useTimeDistance.ts similarity index 100% rename from src/Website-v1/src/hooks/utilities/useTimeDistance.ts rename to archive/next-js-web-app/src/hooks/utilities/useTimeDistance.ts diff --git a/src/Website-v1/src/pages/404.tsx b/archive/next-js-web-app/src/pages/404.tsx similarity index 100% rename from src/Website-v1/src/pages/404.tsx rename to archive/next-js-web-app/src/pages/404.tsx diff --git a/src/Website-v1/src/pages/500.tsx b/archive/next-js-web-app/src/pages/500.tsx similarity index 100% rename from src/Website-v1/src/pages/500.tsx rename to archive/next-js-web-app/src/pages/500.tsx diff --git a/src/Website-v1/src/pages/_app.tsx b/archive/next-js-web-app/src/pages/_app.tsx similarity index 100% rename from src/Website-v1/src/pages/_app.tsx rename to archive/next-js-web-app/src/pages/_app.tsx diff --git a/src/Website-v1/src/pages/_document.tsx b/archive/next-js-web-app/src/pages/_document.tsx similarity index 100% rename from src/Website-v1/src/pages/_document.tsx rename to archive/next-js-web-app/src/pages/_document.tsx diff --git a/src/Website-v1/src/pages/api/beers/[postId]/comments/[commentId].ts b/archive/next-js-web-app/src/pages/api/beers/[postId]/comments/[commentId].ts similarity index 100% rename from src/Website-v1/src/pages/api/beers/[postId]/comments/[commentId].ts rename to archive/next-js-web-app/src/pages/api/beers/[postId]/comments/[commentId].ts diff --git a/src/Website-v1/src/pages/api/beers/[postId]/comments/index.ts b/archive/next-js-web-app/src/pages/api/beers/[postId]/comments/index.ts similarity index 100% rename from src/Website-v1/src/pages/api/beers/[postId]/comments/index.ts rename to archive/next-js-web-app/src/pages/api/beers/[postId]/comments/index.ts diff --git a/src/Website-v1/src/pages/api/beers/[postId]/images/index.ts b/archive/next-js-web-app/src/pages/api/beers/[postId]/images/index.ts similarity index 100% rename from src/Website-v1/src/pages/api/beers/[postId]/images/index.ts rename to archive/next-js-web-app/src/pages/api/beers/[postId]/images/index.ts diff --git a/src/Website-v1/src/pages/api/beers/[postId]/index.ts b/archive/next-js-web-app/src/pages/api/beers/[postId]/index.ts similarity index 100% rename from src/Website-v1/src/pages/api/beers/[postId]/index.ts rename to archive/next-js-web-app/src/pages/api/beers/[postId]/index.ts diff --git a/src/Website-v1/src/pages/api/beers/[postId]/like/index.ts b/archive/next-js-web-app/src/pages/api/beers/[postId]/like/index.ts similarity index 100% rename from src/Website-v1/src/pages/api/beers/[postId]/like/index.ts rename to archive/next-js-web-app/src/pages/api/beers/[postId]/like/index.ts diff --git a/src/Website-v1/src/pages/api/beers/[postId]/like/is-liked.ts b/archive/next-js-web-app/src/pages/api/beers/[postId]/like/is-liked.ts similarity index 100% rename from src/Website-v1/src/pages/api/beers/[postId]/like/is-liked.ts rename to archive/next-js-web-app/src/pages/api/beers/[postId]/like/is-liked.ts diff --git a/src/Website-v1/src/pages/api/beers/[postId]/recommendations.ts b/archive/next-js-web-app/src/pages/api/beers/[postId]/recommendations.ts similarity index 100% rename from src/Website-v1/src/pages/api/beers/[postId]/recommendations.ts rename to archive/next-js-web-app/src/pages/api/beers/[postId]/recommendations.ts diff --git a/src/Website-v1/src/pages/api/beers/create.ts b/archive/next-js-web-app/src/pages/api/beers/create.ts similarity index 100% rename from src/Website-v1/src/pages/api/beers/create.ts rename to archive/next-js-web-app/src/pages/api/beers/create.ts diff --git a/src/Website-v1/src/pages/api/beers/index.ts b/archive/next-js-web-app/src/pages/api/beers/index.ts similarity index 100% rename from src/Website-v1/src/pages/api/beers/index.ts rename to archive/next-js-web-app/src/pages/api/beers/index.ts diff --git a/src/Website-v1/src/pages/api/beers/search.ts b/archive/next-js-web-app/src/pages/api/beers/search.ts similarity index 100% rename from src/Website-v1/src/pages/api/beers/search.ts rename to archive/next-js-web-app/src/pages/api/beers/search.ts diff --git a/src/Website-v1/src/pages/api/beers/styles/[postId]/beers/index.ts b/archive/next-js-web-app/src/pages/api/beers/styles/[postId]/beers/index.ts similarity index 100% rename from src/Website-v1/src/pages/api/beers/styles/[postId]/beers/index.ts rename to archive/next-js-web-app/src/pages/api/beers/styles/[postId]/beers/index.ts diff --git a/src/Website-v1/src/pages/api/beers/styles/[postId]/comments/[commentId].ts b/archive/next-js-web-app/src/pages/api/beers/styles/[postId]/comments/[commentId].ts similarity index 100% rename from src/Website-v1/src/pages/api/beers/styles/[postId]/comments/[commentId].ts rename to archive/next-js-web-app/src/pages/api/beers/styles/[postId]/comments/[commentId].ts diff --git a/src/Website-v1/src/pages/api/beers/styles/[postId]/comments/index.ts b/archive/next-js-web-app/src/pages/api/beers/styles/[postId]/comments/index.ts similarity index 100% rename from src/Website-v1/src/pages/api/beers/styles/[postId]/comments/index.ts rename to archive/next-js-web-app/src/pages/api/beers/styles/[postId]/comments/index.ts diff --git a/src/Website-v1/src/pages/api/beers/styles/[postId]/index.ts b/archive/next-js-web-app/src/pages/api/beers/styles/[postId]/index.ts similarity index 100% rename from src/Website-v1/src/pages/api/beers/styles/[postId]/index.ts rename to archive/next-js-web-app/src/pages/api/beers/styles/[postId]/index.ts diff --git a/src/Website-v1/src/pages/api/beers/styles/[postId]/like/index.ts b/archive/next-js-web-app/src/pages/api/beers/styles/[postId]/like/index.ts similarity index 100% rename from src/Website-v1/src/pages/api/beers/styles/[postId]/like/index.ts rename to archive/next-js-web-app/src/pages/api/beers/styles/[postId]/like/index.ts diff --git a/src/Website-v1/src/pages/api/beers/styles/[postId]/like/is-liked.ts b/archive/next-js-web-app/src/pages/api/beers/styles/[postId]/like/is-liked.ts similarity index 100% rename from src/Website-v1/src/pages/api/beers/styles/[postId]/like/is-liked.ts rename to archive/next-js-web-app/src/pages/api/beers/styles/[postId]/like/is-liked.ts diff --git a/src/Website-v1/src/pages/api/beers/styles/create.ts b/archive/next-js-web-app/src/pages/api/beers/styles/create.ts similarity index 100% rename from src/Website-v1/src/pages/api/beers/styles/create.ts rename to archive/next-js-web-app/src/pages/api/beers/styles/create.ts diff --git a/src/Website-v1/src/pages/api/beers/styles/index.ts b/archive/next-js-web-app/src/pages/api/beers/styles/index.ts similarity index 100% rename from src/Website-v1/src/pages/api/beers/styles/index.ts rename to archive/next-js-web-app/src/pages/api/beers/styles/index.ts diff --git a/src/Website-v1/src/pages/api/breweries/[postId]/beers/index.ts b/archive/next-js-web-app/src/pages/api/breweries/[postId]/beers/index.ts similarity index 100% rename from src/Website-v1/src/pages/api/breweries/[postId]/beers/index.ts rename to archive/next-js-web-app/src/pages/api/breweries/[postId]/beers/index.ts diff --git a/src/Website-v1/src/pages/api/breweries/[postId]/comments/[commentId].ts b/archive/next-js-web-app/src/pages/api/breweries/[postId]/comments/[commentId].ts similarity index 100% rename from src/Website-v1/src/pages/api/breweries/[postId]/comments/[commentId].ts rename to archive/next-js-web-app/src/pages/api/breweries/[postId]/comments/[commentId].ts diff --git a/src/Website-v1/src/pages/api/breweries/[postId]/comments/index.ts b/archive/next-js-web-app/src/pages/api/breweries/[postId]/comments/index.ts similarity index 100% rename from src/Website-v1/src/pages/api/breweries/[postId]/comments/index.ts rename to archive/next-js-web-app/src/pages/api/breweries/[postId]/comments/index.ts diff --git a/src/Website-v1/src/pages/api/breweries/[postId]/images/index.ts b/archive/next-js-web-app/src/pages/api/breweries/[postId]/images/index.ts similarity index 100% rename from src/Website-v1/src/pages/api/breweries/[postId]/images/index.ts rename to archive/next-js-web-app/src/pages/api/breweries/[postId]/images/index.ts diff --git a/src/Website-v1/src/pages/api/breweries/[postId]/index.ts b/archive/next-js-web-app/src/pages/api/breweries/[postId]/index.ts similarity index 100% rename from src/Website-v1/src/pages/api/breweries/[postId]/index.ts rename to archive/next-js-web-app/src/pages/api/breweries/[postId]/index.ts diff --git a/src/Website-v1/src/pages/api/breweries/[postId]/like/index.ts b/archive/next-js-web-app/src/pages/api/breweries/[postId]/like/index.ts similarity index 100% rename from src/Website-v1/src/pages/api/breweries/[postId]/like/index.ts rename to archive/next-js-web-app/src/pages/api/breweries/[postId]/like/index.ts diff --git a/src/Website-v1/src/pages/api/breweries/[postId]/like/is-liked.ts b/archive/next-js-web-app/src/pages/api/breweries/[postId]/like/is-liked.ts similarity index 100% rename from src/Website-v1/src/pages/api/breweries/[postId]/like/is-liked.ts rename to archive/next-js-web-app/src/pages/api/breweries/[postId]/like/is-liked.ts diff --git a/src/Website-v1/src/pages/api/breweries/create.ts b/archive/next-js-web-app/src/pages/api/breweries/create.ts similarity index 100% rename from src/Website-v1/src/pages/api/breweries/create.ts rename to archive/next-js-web-app/src/pages/api/breweries/create.ts diff --git a/src/Website-v1/src/pages/api/breweries/index.ts b/archive/next-js-web-app/src/pages/api/breweries/index.ts similarity index 100% rename from src/Website-v1/src/pages/api/breweries/index.ts rename to archive/next-js-web-app/src/pages/api/breweries/index.ts diff --git a/src/Website-v1/src/pages/api/breweries/map/index.ts b/archive/next-js-web-app/src/pages/api/breweries/map/index.ts similarity index 100% rename from src/Website-v1/src/pages/api/breweries/map/index.ts rename to archive/next-js-web-app/src/pages/api/breweries/map/index.ts diff --git a/src/Website-v1/src/pages/api/users/[id]/follow-user.ts b/archive/next-js-web-app/src/pages/api/users/[id]/follow-user.ts similarity index 100% rename from src/Website-v1/src/pages/api/users/[id]/follow-user.ts rename to archive/next-js-web-app/src/pages/api/users/[id]/follow-user.ts diff --git a/src/Website-v1/src/pages/api/users/[id]/followers.ts b/archive/next-js-web-app/src/pages/api/users/[id]/followers.ts similarity index 100% rename from src/Website-v1/src/pages/api/users/[id]/followers.ts rename to archive/next-js-web-app/src/pages/api/users/[id]/followers.ts diff --git a/src/Website-v1/src/pages/api/users/[id]/following.ts b/archive/next-js-web-app/src/pages/api/users/[id]/following.ts similarity index 100% rename from src/Website-v1/src/pages/api/users/[id]/following.ts rename to archive/next-js-web-app/src/pages/api/users/[id]/following.ts diff --git a/src/Website-v1/src/pages/api/users/[id]/index.ts b/archive/next-js-web-app/src/pages/api/users/[id]/index.ts similarity index 100% rename from src/Website-v1/src/pages/api/users/[id]/index.ts rename to archive/next-js-web-app/src/pages/api/users/[id]/index.ts diff --git a/src/Website-v1/src/pages/api/users/[id]/is-followed.ts b/archive/next-js-web-app/src/pages/api/users/[id]/is-followed.ts similarity index 100% rename from src/Website-v1/src/pages/api/users/[id]/is-followed.ts rename to archive/next-js-web-app/src/pages/api/users/[id]/is-followed.ts diff --git a/src/Website-v1/src/pages/api/users/[id]/posts/beers.ts b/archive/next-js-web-app/src/pages/api/users/[id]/posts/beers.ts similarity index 100% rename from src/Website-v1/src/pages/api/users/[id]/posts/beers.ts rename to archive/next-js-web-app/src/pages/api/users/[id]/posts/beers.ts diff --git a/src/Website-v1/src/pages/api/users/[id]/posts/breweries.ts b/archive/next-js-web-app/src/pages/api/users/[id]/posts/breweries.ts similarity index 100% rename from src/Website-v1/src/pages/api/users/[id]/posts/breweries.ts rename to archive/next-js-web-app/src/pages/api/users/[id]/posts/breweries.ts diff --git a/src/Website-v1/src/pages/api/users/[id]/profile/update-avatar.ts b/archive/next-js-web-app/src/pages/api/users/[id]/profile/update-avatar.ts similarity index 100% rename from src/Website-v1/src/pages/api/users/[id]/profile/update-avatar.ts rename to archive/next-js-web-app/src/pages/api/users/[id]/profile/update-avatar.ts diff --git a/src/Website-v1/src/pages/api/users/[id]/profile/update-profile.ts b/archive/next-js-web-app/src/pages/api/users/[id]/profile/update-profile.ts similarity index 100% rename from src/Website-v1/src/pages/api/users/[id]/profile/update-profile.ts rename to archive/next-js-web-app/src/pages/api/users/[id]/profile/update-profile.ts diff --git a/src/Website-v1/src/pages/api/users/check-email.ts b/archive/next-js-web-app/src/pages/api/users/check-email.ts similarity index 100% rename from src/Website-v1/src/pages/api/users/check-email.ts rename to archive/next-js-web-app/src/pages/api/users/check-email.ts diff --git a/src/Website-v1/src/pages/api/users/check-username.ts b/archive/next-js-web-app/src/pages/api/users/check-username.ts similarity index 100% rename from src/Website-v1/src/pages/api/users/check-username.ts rename to archive/next-js-web-app/src/pages/api/users/check-username.ts diff --git a/src/Website-v1/src/pages/api/users/confirm.ts b/archive/next-js-web-app/src/pages/api/users/confirm.ts similarity index 100% rename from src/Website-v1/src/pages/api/users/confirm.ts rename to archive/next-js-web-app/src/pages/api/users/confirm.ts diff --git a/src/Website-v1/src/pages/api/users/current.ts b/archive/next-js-web-app/src/pages/api/users/current.ts similarity index 100% rename from src/Website-v1/src/pages/api/users/current.ts rename to archive/next-js-web-app/src/pages/api/users/current.ts diff --git a/src/Website-v1/src/pages/api/users/edit-password.ts b/archive/next-js-web-app/src/pages/api/users/edit-password.ts similarity index 100% rename from src/Website-v1/src/pages/api/users/edit-password.ts rename to archive/next-js-web-app/src/pages/api/users/edit-password.ts diff --git a/src/Website-v1/src/pages/api/users/forgot-password.ts b/archive/next-js-web-app/src/pages/api/users/forgot-password.ts similarity index 100% rename from src/Website-v1/src/pages/api/users/forgot-password.ts rename to archive/next-js-web-app/src/pages/api/users/forgot-password.ts diff --git a/src/Website-v1/src/pages/api/users/login.ts b/archive/next-js-web-app/src/pages/api/users/login.ts similarity index 100% rename from src/Website-v1/src/pages/api/users/login.ts rename to archive/next-js-web-app/src/pages/api/users/login.ts diff --git a/src/Website-v1/src/pages/api/users/logout.ts b/archive/next-js-web-app/src/pages/api/users/logout.ts similarity index 100% rename from src/Website-v1/src/pages/api/users/logout.ts rename to archive/next-js-web-app/src/pages/api/users/logout.ts diff --git a/src/Website-v1/src/pages/api/users/register.ts b/archive/next-js-web-app/src/pages/api/users/register.ts similarity index 100% rename from src/Website-v1/src/pages/api/users/register.ts rename to archive/next-js-web-app/src/pages/api/users/register.ts diff --git a/src/Website-v1/src/pages/api/users/resend-confirmation.ts b/archive/next-js-web-app/src/pages/api/users/resend-confirmation.ts similarity index 100% rename from src/Website-v1/src/pages/api/users/resend-confirmation.ts rename to archive/next-js-web-app/src/pages/api/users/resend-confirmation.ts diff --git a/src/Website-v1/src/pages/beers/[id]/edit.tsx b/archive/next-js-web-app/src/pages/beers/[id]/edit.tsx similarity index 100% rename from src/Website-v1/src/pages/beers/[id]/edit.tsx rename to archive/next-js-web-app/src/pages/beers/[id]/edit.tsx diff --git a/src/Website-v1/src/pages/beers/[id]/index.tsx b/archive/next-js-web-app/src/pages/beers/[id]/index.tsx similarity index 100% rename from src/Website-v1/src/pages/beers/[id]/index.tsx rename to archive/next-js-web-app/src/pages/beers/[id]/index.tsx diff --git a/src/Website-v1/src/pages/beers/index.tsx b/archive/next-js-web-app/src/pages/beers/index.tsx similarity index 100% rename from src/Website-v1/src/pages/beers/index.tsx rename to archive/next-js-web-app/src/pages/beers/index.tsx diff --git a/src/Website-v1/src/pages/beers/search.tsx b/archive/next-js-web-app/src/pages/beers/search.tsx similarity index 100% rename from src/Website-v1/src/pages/beers/search.tsx rename to archive/next-js-web-app/src/pages/beers/search.tsx diff --git a/src/Website-v1/src/pages/beers/styles/[id]/index.tsx b/archive/next-js-web-app/src/pages/beers/styles/[id]/index.tsx similarity index 100% rename from src/Website-v1/src/pages/beers/styles/[id]/index.tsx rename to archive/next-js-web-app/src/pages/beers/styles/[id]/index.tsx diff --git a/src/Website-v1/src/pages/beers/styles/index.tsx b/archive/next-js-web-app/src/pages/beers/styles/index.tsx similarity index 100% rename from src/Website-v1/src/pages/beers/styles/index.tsx rename to archive/next-js-web-app/src/pages/beers/styles/index.tsx diff --git a/src/Website-v1/src/pages/breweries/[id]/beers/create.tsx b/archive/next-js-web-app/src/pages/breweries/[id]/beers/create.tsx similarity index 100% rename from src/Website-v1/src/pages/breweries/[id]/beers/create.tsx rename to archive/next-js-web-app/src/pages/breweries/[id]/beers/create.tsx diff --git a/src/Website-v1/src/pages/breweries/[id]/edit.tsx b/archive/next-js-web-app/src/pages/breweries/[id]/edit.tsx similarity index 100% rename from src/Website-v1/src/pages/breweries/[id]/edit.tsx rename to archive/next-js-web-app/src/pages/breweries/[id]/edit.tsx diff --git a/src/Website-v1/src/pages/breweries/[id]/index.tsx b/archive/next-js-web-app/src/pages/breweries/[id]/index.tsx similarity index 100% rename from src/Website-v1/src/pages/breweries/[id]/index.tsx rename to archive/next-js-web-app/src/pages/breweries/[id]/index.tsx diff --git a/src/Website-v1/src/pages/breweries/create.tsx b/archive/next-js-web-app/src/pages/breweries/create.tsx similarity index 100% rename from src/Website-v1/src/pages/breweries/create.tsx rename to archive/next-js-web-app/src/pages/breweries/create.tsx diff --git a/src/Website-v1/src/pages/breweries/index.tsx b/archive/next-js-web-app/src/pages/breweries/index.tsx similarity index 100% rename from src/Website-v1/src/pages/breweries/index.tsx rename to archive/next-js-web-app/src/pages/breweries/index.tsx diff --git a/src/Website-v1/src/pages/breweries/map.tsx b/archive/next-js-web-app/src/pages/breweries/map.tsx similarity index 100% rename from src/Website-v1/src/pages/breweries/map.tsx rename to archive/next-js-web-app/src/pages/breweries/map.tsx diff --git a/src/Website-v1/src/pages/index.tsx b/archive/next-js-web-app/src/pages/index.tsx similarity index 100% rename from src/Website-v1/src/pages/index.tsx rename to archive/next-js-web-app/src/pages/index.tsx diff --git a/src/Website-v1/src/pages/login/index.tsx b/archive/next-js-web-app/src/pages/login/index.tsx similarity index 100% rename from src/Website-v1/src/pages/login/index.tsx rename to archive/next-js-web-app/src/pages/login/index.tsx diff --git a/src/Website-v1/src/pages/register/index.tsx b/archive/next-js-web-app/src/pages/register/index.tsx similarity index 100% rename from src/Website-v1/src/pages/register/index.tsx rename to archive/next-js-web-app/src/pages/register/index.tsx diff --git a/src/Website-v1/src/pages/users/[id].tsx b/archive/next-js-web-app/src/pages/users/[id].tsx similarity index 100% rename from src/Website-v1/src/pages/users/[id].tsx rename to archive/next-js-web-app/src/pages/users/[id].tsx diff --git a/src/Website-v1/src/pages/users/account/edit-profile.tsx b/archive/next-js-web-app/src/pages/users/account/edit-profile.tsx similarity index 100% rename from src/Website-v1/src/pages/users/account/edit-profile.tsx rename to archive/next-js-web-app/src/pages/users/account/edit-profile.tsx diff --git a/src/Website-v1/src/pages/users/account/index.tsx b/archive/next-js-web-app/src/pages/users/account/index.tsx similarity index 100% rename from src/Website-v1/src/pages/users/account/index.tsx rename to archive/next-js-web-app/src/pages/users/account/index.tsx diff --git a/src/Website-v1/src/pages/users/confirm.tsx b/archive/next-js-web-app/src/pages/users/confirm.tsx similarity index 100% rename from src/Website-v1/src/pages/users/confirm.tsx rename to archive/next-js-web-app/src/pages/users/confirm.tsx diff --git a/src/Website-v1/src/pages/users/current.tsx b/archive/next-js-web-app/src/pages/users/current.tsx similarity index 100% rename from src/Website-v1/src/pages/users/current.tsx rename to archive/next-js-web-app/src/pages/users/current.tsx diff --git a/src/Website-v1/src/pages/users/forgot-password.tsx b/archive/next-js-web-app/src/pages/users/forgot-password.tsx similarity index 100% rename from src/Website-v1/src/pages/users/forgot-password.tsx rename to archive/next-js-web-app/src/pages/users/forgot-password.tsx diff --git a/src/Website-v1/src/pages/users/reset-password.tsx b/archive/next-js-web-app/src/pages/users/reset-password.tsx similarity index 100% rename from src/Website-v1/src/pages/users/reset-password.tsx rename to archive/next-js-web-app/src/pages/users/reset-password.tsx diff --git a/src/Website-v1/src/prisma/DBClient.ts b/archive/next-js-web-app/src/prisma/DBClient.ts similarity index 100% rename from src/Website-v1/src/prisma/DBClient.ts rename to archive/next-js-web-app/src/prisma/DBClient.ts diff --git a/src/Website-v1/src/prisma/migrations/20230502225418_/migration.sql b/archive/next-js-web-app/src/prisma/migrations/20230502225418_/migration.sql similarity index 100% rename from src/Website-v1/src/prisma/migrations/20230502225418_/migration.sql rename to archive/next-js-web-app/src/prisma/migrations/20230502225418_/migration.sql diff --git a/src/Website-v1/src/prisma/migrations/20230510010306_/migration.sql b/archive/next-js-web-app/src/prisma/migrations/20230510010306_/migration.sql similarity index 100% rename from src/Website-v1/src/prisma/migrations/20230510010306_/migration.sql rename to archive/next-js-web-app/src/prisma/migrations/20230510010306_/migration.sql diff --git a/src/Website-v1/src/prisma/migrations/20230603010553_/migration.sql b/archive/next-js-web-app/src/prisma/migrations/20230603010553_/migration.sql similarity index 100% rename from src/Website-v1/src/prisma/migrations/20230603010553_/migration.sql rename to archive/next-js-web-app/src/prisma/migrations/20230603010553_/migration.sql diff --git a/src/Website-v1/src/prisma/migrations/20230918194402_/migration.sql b/archive/next-js-web-app/src/prisma/migrations/20230918194402_/migration.sql similarity index 100% rename from src/Website-v1/src/prisma/migrations/20230918194402_/migration.sql rename to archive/next-js-web-app/src/prisma/migrations/20230918194402_/migration.sql diff --git a/src/Website-v1/src/prisma/migrations/20230922054646_/migration.sql b/archive/next-js-web-app/src/prisma/migrations/20230922054646_/migration.sql similarity index 100% rename from src/Website-v1/src/prisma/migrations/20230922054646_/migration.sql rename to archive/next-js-web-app/src/prisma/migrations/20230922054646_/migration.sql diff --git a/src/Website-v1/src/prisma/migrations/20230923043953_/migration.sql b/archive/next-js-web-app/src/prisma/migrations/20230923043953_/migration.sql similarity index 100% rename from src/Website-v1/src/prisma/migrations/20230923043953_/migration.sql rename to archive/next-js-web-app/src/prisma/migrations/20230923043953_/migration.sql diff --git a/src/Website-v1/src/prisma/migrations/20231009153905_/migration.sql b/archive/next-js-web-app/src/prisma/migrations/20231009153905_/migration.sql similarity index 100% rename from src/Website-v1/src/prisma/migrations/20231009153905_/migration.sql rename to archive/next-js-web-app/src/prisma/migrations/20231009153905_/migration.sql diff --git a/src/Website-v1/src/prisma/migrations/20231106024511_/migration.sql b/archive/next-js-web-app/src/prisma/migrations/20231106024511_/migration.sql similarity index 100% rename from src/Website-v1/src/prisma/migrations/20231106024511_/migration.sql rename to archive/next-js-web-app/src/prisma/migrations/20231106024511_/migration.sql diff --git a/src/Website-v1/src/prisma/migrations/20231112221155_/migration.sql b/archive/next-js-web-app/src/prisma/migrations/20231112221155_/migration.sql similarity index 100% rename from src/Website-v1/src/prisma/migrations/20231112221155_/migration.sql rename to archive/next-js-web-app/src/prisma/migrations/20231112221155_/migration.sql diff --git a/src/Website-v1/src/prisma/migrations/migration_lock.toml b/archive/next-js-web-app/src/prisma/migrations/migration_lock.toml similarity index 100% rename from src/Website-v1/src/prisma/migrations/migration_lock.toml rename to archive/next-js-web-app/src/prisma/migrations/migration_lock.toml diff --git a/src/Website-v1/src/prisma/schema.prisma b/archive/next-js-web-app/src/prisma/schema.prisma similarity index 100% rename from src/Website-v1/src/prisma/schema.prisma rename to archive/next-js-web-app/src/prisma/schema.prisma diff --git a/src/Website-v1/src/prisma/seed/clear/clearCloudinaryStorage.ts b/archive/next-js-web-app/src/prisma/seed/clear/clearCloudinaryStorage.ts similarity index 100% rename from src/Website-v1/src/prisma/seed/clear/clearCloudinaryStorage.ts rename to archive/next-js-web-app/src/prisma/seed/clear/clearCloudinaryStorage.ts diff --git a/src/Website-v1/src/prisma/seed/clear/clearDatabase.ts b/archive/next-js-web-app/src/prisma/seed/clear/clearDatabase.ts similarity index 100% rename from src/Website-v1/src/prisma/seed/clear/clearDatabase.ts rename to archive/next-js-web-app/src/prisma/seed/clear/clearDatabase.ts diff --git a/src/Website-v1/src/prisma/seed/clear/index.ts b/archive/next-js-web-app/src/prisma/seed/clear/index.ts similarity index 100% rename from src/Website-v1/src/prisma/seed/clear/index.ts rename to archive/next-js-web-app/src/prisma/seed/clear/index.ts diff --git a/src/Website-v1/src/prisma/seed/create/createAdminUser.ts b/archive/next-js-web-app/src/prisma/seed/create/createAdminUser.ts similarity index 100% rename from src/Website-v1/src/prisma/seed/create/createAdminUser.ts rename to archive/next-js-web-app/src/prisma/seed/create/createAdminUser.ts diff --git a/src/Website-v1/src/prisma/seed/create/createNewBeerImages.ts b/archive/next-js-web-app/src/prisma/seed/create/createNewBeerImages.ts similarity index 100% rename from src/Website-v1/src/prisma/seed/create/createNewBeerImages.ts rename to archive/next-js-web-app/src/prisma/seed/create/createNewBeerImages.ts diff --git a/src/Website-v1/src/prisma/seed/create/createNewBeerPostComments.ts b/archive/next-js-web-app/src/prisma/seed/create/createNewBeerPostComments.ts similarity index 100% rename from src/Website-v1/src/prisma/seed/create/createNewBeerPostComments.ts rename to archive/next-js-web-app/src/prisma/seed/create/createNewBeerPostComments.ts diff --git a/src/Website-v1/src/prisma/seed/create/createNewBeerPostLikes.ts b/archive/next-js-web-app/src/prisma/seed/create/createNewBeerPostLikes.ts similarity index 100% rename from src/Website-v1/src/prisma/seed/create/createNewBeerPostLikes.ts rename to archive/next-js-web-app/src/prisma/seed/create/createNewBeerPostLikes.ts diff --git a/src/Website-v1/src/prisma/seed/create/createNewBeerPosts.ts b/archive/next-js-web-app/src/prisma/seed/create/createNewBeerPosts.ts similarity index 100% rename from src/Website-v1/src/prisma/seed/create/createNewBeerPosts.ts rename to archive/next-js-web-app/src/prisma/seed/create/createNewBeerPosts.ts diff --git a/src/Website-v1/src/prisma/seed/create/createNewBeerStyleComments.ts b/archive/next-js-web-app/src/prisma/seed/create/createNewBeerStyleComments.ts similarity index 100% rename from src/Website-v1/src/prisma/seed/create/createNewBeerStyleComments.ts rename to archive/next-js-web-app/src/prisma/seed/create/createNewBeerStyleComments.ts diff --git a/src/Website-v1/src/prisma/seed/create/createNewBeerStyleLikes.ts b/archive/next-js-web-app/src/prisma/seed/create/createNewBeerStyleLikes.ts similarity index 100% rename from src/Website-v1/src/prisma/seed/create/createNewBeerStyleLikes.ts rename to archive/next-js-web-app/src/prisma/seed/create/createNewBeerStyleLikes.ts diff --git a/src/Website-v1/src/prisma/seed/create/createNewBeerStyles.ts b/archive/next-js-web-app/src/prisma/seed/create/createNewBeerStyles.ts similarity index 100% rename from src/Website-v1/src/prisma/seed/create/createNewBeerStyles.ts rename to archive/next-js-web-app/src/prisma/seed/create/createNewBeerStyles.ts diff --git a/src/Website-v1/src/prisma/seed/create/createNewBreweryImages.ts b/archive/next-js-web-app/src/prisma/seed/create/createNewBreweryImages.ts similarity index 100% rename from src/Website-v1/src/prisma/seed/create/createNewBreweryImages.ts rename to archive/next-js-web-app/src/prisma/seed/create/createNewBreweryImages.ts diff --git a/src/Website-v1/src/prisma/seed/create/createNewBreweryPostComments.ts b/archive/next-js-web-app/src/prisma/seed/create/createNewBreweryPostComments.ts similarity index 100% rename from src/Website-v1/src/prisma/seed/create/createNewBreweryPostComments.ts rename to archive/next-js-web-app/src/prisma/seed/create/createNewBreweryPostComments.ts diff --git a/src/Website-v1/src/prisma/seed/create/createNewBreweryPostLikes.ts b/archive/next-js-web-app/src/prisma/seed/create/createNewBreweryPostLikes.ts similarity index 100% rename from src/Website-v1/src/prisma/seed/create/createNewBreweryPostLikes.ts rename to archive/next-js-web-app/src/prisma/seed/create/createNewBreweryPostLikes.ts diff --git a/src/Website-v1/src/prisma/seed/create/createNewBreweryPosts.ts b/archive/next-js-web-app/src/prisma/seed/create/createNewBreweryPosts.ts similarity index 100% rename from src/Website-v1/src/prisma/seed/create/createNewBreweryPosts.ts rename to archive/next-js-web-app/src/prisma/seed/create/createNewBreweryPosts.ts diff --git a/src/Website-v1/src/prisma/seed/create/createNewLocations.ts b/archive/next-js-web-app/src/prisma/seed/create/createNewLocations.ts similarity index 100% rename from src/Website-v1/src/prisma/seed/create/createNewLocations.ts rename to archive/next-js-web-app/src/prisma/seed/create/createNewLocations.ts diff --git a/src/Website-v1/src/prisma/seed/create/createNewUserAvatars.ts b/archive/next-js-web-app/src/prisma/seed/create/createNewUserAvatars.ts similarity index 100% rename from src/Website-v1/src/prisma/seed/create/createNewUserAvatars.ts rename to archive/next-js-web-app/src/prisma/seed/create/createNewUserAvatars.ts diff --git a/src/Website-v1/src/prisma/seed/create/createNewUserFollows.ts b/archive/next-js-web-app/src/prisma/seed/create/createNewUserFollows.ts similarity index 100% rename from src/Website-v1/src/prisma/seed/create/createNewUserFollows.ts rename to archive/next-js-web-app/src/prisma/seed/create/createNewUserFollows.ts diff --git a/src/Website-v1/src/prisma/seed/create/createNewUsers.ts b/archive/next-js-web-app/src/prisma/seed/create/createNewUsers.ts similarity index 100% rename from src/Website-v1/src/prisma/seed/create/createNewUsers.ts rename to archive/next-js-web-app/src/prisma/seed/create/createNewUsers.ts diff --git a/src/Website-v1/src/prisma/seed/index.ts b/archive/next-js-web-app/src/prisma/seed/index.ts similarity index 100% rename from src/Website-v1/src/prisma/seed/index.ts rename to archive/next-js-web-app/src/prisma/seed/index.ts diff --git a/src/Website-v1/src/prisma/seed/util/beerStyles.ts b/archive/next-js-web-app/src/prisma/seed/util/beerStyles.ts similarity index 100% rename from src/Website-v1/src/prisma/seed/util/beerStyles.ts rename to archive/next-js-web-app/src/prisma/seed/util/beerStyles.ts diff --git a/src/Website-v1/src/prisma/seed/util/canadianCities.ts b/archive/next-js-web-app/src/prisma/seed/util/canadianCities.ts similarity index 100% rename from src/Website-v1/src/prisma/seed/util/canadianCities.ts rename to archive/next-js-web-app/src/prisma/seed/util/canadianCities.ts diff --git a/src/Website-v1/src/prisma/seed/util/imageUrls.ts b/archive/next-js-web-app/src/prisma/seed/util/imageUrls.ts similarity index 100% rename from src/Website-v1/src/prisma/seed/util/imageUrls.ts rename to archive/next-js-web-app/src/prisma/seed/util/imageUrls.ts diff --git a/src/Website-v1/src/reducers/accountPageReducer.ts b/archive/next-js-web-app/src/reducers/accountPageReducer.ts similarity index 100% rename from src/Website-v1/src/reducers/accountPageReducer.ts rename to archive/next-js-web-app/src/reducers/accountPageReducer.ts diff --git a/src/Website-v1/src/requests/comments/beer-comment/index.ts b/archive/next-js-web-app/src/requests/comments/beer-comment/index.ts similarity index 100% rename from src/Website-v1/src/requests/comments/beer-comment/index.ts rename to archive/next-js-web-app/src/requests/comments/beer-comment/index.ts diff --git a/src/Website-v1/src/requests/comments/beer-comment/types/index.ts b/archive/next-js-web-app/src/requests/comments/beer-comment/types/index.ts similarity index 100% rename from src/Website-v1/src/requests/comments/beer-comment/types/index.ts rename to archive/next-js-web-app/src/requests/comments/beer-comment/types/index.ts diff --git a/src/Website-v1/src/requests/comments/beer-style-comment/index.ts b/archive/next-js-web-app/src/requests/comments/beer-style-comment/index.ts similarity index 100% rename from src/Website-v1/src/requests/comments/beer-style-comment/index.ts rename to archive/next-js-web-app/src/requests/comments/beer-style-comment/index.ts diff --git a/src/Website-v1/src/requests/comments/beer-style-comment/types/index.ts b/archive/next-js-web-app/src/requests/comments/beer-style-comment/types/index.ts similarity index 100% rename from src/Website-v1/src/requests/comments/beer-style-comment/types/index.ts rename to archive/next-js-web-app/src/requests/comments/beer-style-comment/types/index.ts diff --git a/src/Website-v1/src/requests/comments/brewery-comment/index.ts b/archive/next-js-web-app/src/requests/comments/brewery-comment/index.ts similarity index 100% rename from src/Website-v1/src/requests/comments/brewery-comment/index.ts rename to archive/next-js-web-app/src/requests/comments/brewery-comment/index.ts diff --git a/src/Website-v1/src/requests/comments/brewery-comment/sendCreateBreweryCommentRequest.ts b/archive/next-js-web-app/src/requests/comments/brewery-comment/sendCreateBreweryCommentRequest.ts similarity index 100% rename from src/Website-v1/src/requests/comments/brewery-comment/sendCreateBreweryCommentRequest.ts rename to archive/next-js-web-app/src/requests/comments/brewery-comment/sendCreateBreweryCommentRequest.ts diff --git a/src/Website-v1/src/requests/comments/brewery-comment/types/index.ts b/archive/next-js-web-app/src/requests/comments/brewery-comment/types/index.ts similarity index 100% rename from src/Website-v1/src/requests/comments/brewery-comment/types/index.ts rename to archive/next-js-web-app/src/requests/comments/brewery-comment/types/index.ts diff --git a/src/Website-v1/src/requests/images/beer-image/sendUploadBeerImageRequest.ts b/archive/next-js-web-app/src/requests/images/beer-image/sendUploadBeerImageRequest.ts similarity index 100% rename from src/Website-v1/src/requests/images/beer-image/sendUploadBeerImageRequest.ts rename to archive/next-js-web-app/src/requests/images/beer-image/sendUploadBeerImageRequest.ts diff --git a/src/Website-v1/src/requests/images/brewery-image/sendUploadBreweryImageRequest.ts b/archive/next-js-web-app/src/requests/images/brewery-image/sendUploadBreweryImageRequest.ts similarity index 100% rename from src/Website-v1/src/requests/images/brewery-image/sendUploadBreweryImageRequest.ts rename to archive/next-js-web-app/src/requests/images/brewery-image/sendUploadBreweryImageRequest.ts diff --git a/src/Website-v1/src/requests/likes/beer-post-like/sendBeerPostLikeRequest.ts b/archive/next-js-web-app/src/requests/likes/beer-post-like/sendBeerPostLikeRequest.ts similarity index 100% rename from src/Website-v1/src/requests/likes/beer-post-like/sendBeerPostLikeRequest.ts rename to archive/next-js-web-app/src/requests/likes/beer-post-like/sendBeerPostLikeRequest.ts diff --git a/src/Website-v1/src/requests/likes/beer-style-like/sendBeerStyleLikeRequest.ts b/archive/next-js-web-app/src/requests/likes/beer-style-like/sendBeerStyleLikeRequest.ts similarity index 100% rename from src/Website-v1/src/requests/likes/beer-style-like/sendBeerStyleLikeRequest.ts rename to archive/next-js-web-app/src/requests/likes/beer-style-like/sendBeerStyleLikeRequest.ts diff --git a/src/Website-v1/src/requests/likes/brewery-post-like/sendBreweryPostLikeRequest.ts b/archive/next-js-web-app/src/requests/likes/brewery-post-like/sendBreweryPostLikeRequest.ts similarity index 100% rename from src/Website-v1/src/requests/likes/brewery-post-like/sendBreweryPostLikeRequest.ts rename to archive/next-js-web-app/src/requests/likes/brewery-post-like/sendBreweryPostLikeRequest.ts diff --git a/src/Website-v1/src/requests/posts/beer-post/index.ts b/archive/next-js-web-app/src/requests/posts/beer-post/index.ts similarity index 100% rename from src/Website-v1/src/requests/posts/beer-post/index.ts rename to archive/next-js-web-app/src/requests/posts/beer-post/index.ts diff --git a/src/Website-v1/src/requests/posts/beer-post/types/index.ts b/archive/next-js-web-app/src/requests/posts/beer-post/types/index.ts similarity index 100% rename from src/Website-v1/src/requests/posts/beer-post/types/index.ts rename to archive/next-js-web-app/src/requests/posts/beer-post/types/index.ts diff --git a/src/Website-v1/src/requests/posts/brewery-post/index.ts b/archive/next-js-web-app/src/requests/posts/brewery-post/index.ts similarity index 100% rename from src/Website-v1/src/requests/posts/brewery-post/index.ts rename to archive/next-js-web-app/src/requests/posts/brewery-post/index.ts diff --git a/src/Website-v1/src/requests/posts/brewery-post/types/index.ts b/archive/next-js-web-app/src/requests/posts/brewery-post/types/index.ts similarity index 100% rename from src/Website-v1/src/requests/posts/brewery-post/types/index.ts rename to archive/next-js-web-app/src/requests/posts/brewery-post/types/index.ts diff --git a/src/Website-v1/src/requests/users/auth/index.ts b/archive/next-js-web-app/src/requests/users/auth/index.ts similarity index 100% rename from src/Website-v1/src/requests/users/auth/index.ts rename to archive/next-js-web-app/src/requests/users/auth/index.ts diff --git a/src/Website-v1/src/requests/users/auth/types/index.ts b/archive/next-js-web-app/src/requests/users/auth/types/index.ts similarity index 100% rename from src/Website-v1/src/requests/users/auth/types/index.ts rename to archive/next-js-web-app/src/requests/users/auth/types/index.ts diff --git a/src/Website-v1/src/requests/users/profile/sendUpdateUserAvatarRequest.ts b/archive/next-js-web-app/src/requests/users/profile/sendUpdateUserAvatarRequest.ts similarity index 100% rename from src/Website-v1/src/requests/users/profile/sendUpdateUserAvatarRequest.ts rename to archive/next-js-web-app/src/requests/users/profile/sendUpdateUserAvatarRequest.ts diff --git a/src/Website-v1/src/requests/users/profile/sendUpdateUserProfileRequest.ts b/archive/next-js-web-app/src/requests/users/profile/sendUpdateUserProfileRequest.ts similarity index 100% rename from src/Website-v1/src/requests/users/profile/sendUpdateUserProfileRequest.ts rename to archive/next-js-web-app/src/requests/users/profile/sendUpdateUserProfileRequest.ts diff --git a/src/Website-v1/src/requests/users/profile/validateUsernameRequest.ts b/archive/next-js-web-app/src/requests/users/profile/validateUsernameRequest.ts similarity index 100% rename from src/Website-v1/src/requests/users/profile/validateUsernameRequest.ts rename to archive/next-js-web-app/src/requests/users/profile/validateUsernameRequest.ts diff --git a/src/Website-v1/src/services/comments/beer-comment/index.ts b/archive/next-js-web-app/src/services/comments/beer-comment/index.ts similarity index 100% rename from src/Website-v1/src/services/comments/beer-comment/index.ts rename to archive/next-js-web-app/src/services/comments/beer-comment/index.ts diff --git a/src/Website-v1/src/services/comments/beer-comment/types/index.ts b/archive/next-js-web-app/src/services/comments/beer-comment/types/index.ts similarity index 100% rename from src/Website-v1/src/services/comments/beer-comment/types/index.ts rename to archive/next-js-web-app/src/services/comments/beer-comment/types/index.ts diff --git a/src/Website-v1/src/services/comments/beer-style-comment/index.ts b/archive/next-js-web-app/src/services/comments/beer-style-comment/index.ts similarity index 100% rename from src/Website-v1/src/services/comments/beer-style-comment/index.ts rename to archive/next-js-web-app/src/services/comments/beer-style-comment/index.ts diff --git a/src/Website-v1/src/services/comments/beer-style-comment/types/index.ts b/archive/next-js-web-app/src/services/comments/beer-style-comment/types/index.ts similarity index 100% rename from src/Website-v1/src/services/comments/beer-style-comment/types/index.ts rename to archive/next-js-web-app/src/services/comments/beer-style-comment/types/index.ts diff --git a/src/Website-v1/src/services/comments/brewery-comment/index.ts b/archive/next-js-web-app/src/services/comments/brewery-comment/index.ts similarity index 100% rename from src/Website-v1/src/services/comments/brewery-comment/index.ts rename to archive/next-js-web-app/src/services/comments/brewery-comment/index.ts diff --git a/src/Website-v1/src/services/comments/brewery-comment/types/index.ts b/archive/next-js-web-app/src/services/comments/brewery-comment/types/index.ts similarity index 100% rename from src/Website-v1/src/services/comments/brewery-comment/types/index.ts rename to archive/next-js-web-app/src/services/comments/brewery-comment/types/index.ts diff --git a/src/Website-v1/src/services/images/beer-image/index.ts b/archive/next-js-web-app/src/services/images/beer-image/index.ts similarity index 100% rename from src/Website-v1/src/services/images/beer-image/index.ts rename to archive/next-js-web-app/src/services/images/beer-image/index.ts diff --git a/src/Website-v1/src/services/images/beer-image/types/index.ts b/archive/next-js-web-app/src/services/images/beer-image/types/index.ts similarity index 100% rename from src/Website-v1/src/services/images/beer-image/types/index.ts rename to archive/next-js-web-app/src/services/images/beer-image/types/index.ts diff --git a/src/Website-v1/src/services/images/brewery-image/index.ts b/archive/next-js-web-app/src/services/images/brewery-image/index.ts similarity index 100% rename from src/Website-v1/src/services/images/brewery-image/index.ts rename to archive/next-js-web-app/src/services/images/brewery-image/index.ts diff --git a/src/Website-v1/src/services/images/brewery-image/types/index.ts b/archive/next-js-web-app/src/services/images/brewery-image/types/index.ts similarity index 100% rename from src/Website-v1/src/services/images/brewery-image/types/index.ts rename to archive/next-js-web-app/src/services/images/brewery-image/types/index.ts diff --git a/src/Website-v1/src/services/likes/beer-post-like/index.ts b/archive/next-js-web-app/src/services/likes/beer-post-like/index.ts similarity index 100% rename from src/Website-v1/src/services/likes/beer-post-like/index.ts rename to archive/next-js-web-app/src/services/likes/beer-post-like/index.ts diff --git a/src/Website-v1/src/services/likes/beer-post-like/schema/BeerPostLikeSchema.ts b/archive/next-js-web-app/src/services/likes/beer-post-like/schema/BeerPostLikeSchema.ts similarity index 100% rename from src/Website-v1/src/services/likes/beer-post-like/schema/BeerPostLikeSchema.ts rename to archive/next-js-web-app/src/services/likes/beer-post-like/schema/BeerPostLikeSchema.ts diff --git a/src/Website-v1/src/services/likes/beer-post-like/types/index.ts b/archive/next-js-web-app/src/services/likes/beer-post-like/types/index.ts similarity index 100% rename from src/Website-v1/src/services/likes/beer-post-like/types/index.ts rename to archive/next-js-web-app/src/services/likes/beer-post-like/types/index.ts diff --git a/src/Website-v1/src/services/likes/beer-style-like/index.ts b/archive/next-js-web-app/src/services/likes/beer-style-like/index.ts similarity index 100% rename from src/Website-v1/src/services/likes/beer-style-like/index.ts rename to archive/next-js-web-app/src/services/likes/beer-style-like/index.ts diff --git a/src/Website-v1/src/services/likes/beer-style-like/schema/BeerStyleLikeSchema.ts b/archive/next-js-web-app/src/services/likes/beer-style-like/schema/BeerStyleLikeSchema.ts similarity index 100% rename from src/Website-v1/src/services/likes/beer-style-like/schema/BeerStyleLikeSchema.ts rename to archive/next-js-web-app/src/services/likes/beer-style-like/schema/BeerStyleLikeSchema.ts diff --git a/src/Website-v1/src/services/likes/beer-style-like/types/index.ts b/archive/next-js-web-app/src/services/likes/beer-style-like/types/index.ts similarity index 100% rename from src/Website-v1/src/services/likes/beer-style-like/types/index.ts rename to archive/next-js-web-app/src/services/likes/beer-style-like/types/index.ts diff --git a/src/Website-v1/src/services/likes/brewery-post-like/index.ts b/archive/next-js-web-app/src/services/likes/brewery-post-like/index.ts similarity index 100% rename from src/Website-v1/src/services/likes/brewery-post-like/index.ts rename to archive/next-js-web-app/src/services/likes/brewery-post-like/index.ts diff --git a/src/Website-v1/src/services/likes/brewery-post-like/schema/BreweryPostLikeSchema.ts b/archive/next-js-web-app/src/services/likes/brewery-post-like/schema/BreweryPostLikeSchema.ts similarity index 100% rename from src/Website-v1/src/services/likes/brewery-post-like/schema/BreweryPostLikeSchema.ts rename to archive/next-js-web-app/src/services/likes/brewery-post-like/schema/BreweryPostLikeSchema.ts diff --git a/src/Website-v1/src/services/likes/brewery-post-like/types/index.ts b/archive/next-js-web-app/src/services/likes/brewery-post-like/types/index.ts similarity index 100% rename from src/Website-v1/src/services/likes/brewery-post-like/types/index.ts rename to archive/next-js-web-app/src/services/likes/brewery-post-like/types/index.ts diff --git a/src/Website-v1/src/services/posts/beer-post/index.ts b/archive/next-js-web-app/src/services/posts/beer-post/index.ts similarity index 100% rename from src/Website-v1/src/services/posts/beer-post/index.ts rename to archive/next-js-web-app/src/services/posts/beer-post/index.ts diff --git a/src/Website-v1/src/services/posts/beer-post/schema/BeerPostQueryResult.ts b/archive/next-js-web-app/src/services/posts/beer-post/schema/BeerPostQueryResult.ts similarity index 100% rename from src/Website-v1/src/services/posts/beer-post/schema/BeerPostQueryResult.ts rename to archive/next-js-web-app/src/services/posts/beer-post/schema/BeerPostQueryResult.ts diff --git a/src/Website-v1/src/services/posts/beer-post/schema/CreateBeerPostValidationSchema.ts b/archive/next-js-web-app/src/services/posts/beer-post/schema/CreateBeerPostValidationSchema.ts similarity index 100% rename from src/Website-v1/src/services/posts/beer-post/schema/CreateBeerPostValidationSchema.ts rename to archive/next-js-web-app/src/services/posts/beer-post/schema/CreateBeerPostValidationSchema.ts diff --git a/src/Website-v1/src/services/posts/beer-post/schema/EditBeerPostValidationSchema.ts b/archive/next-js-web-app/src/services/posts/beer-post/schema/EditBeerPostValidationSchema.ts similarity index 100% rename from src/Website-v1/src/services/posts/beer-post/schema/EditBeerPostValidationSchema.ts rename to archive/next-js-web-app/src/services/posts/beer-post/schema/EditBeerPostValidationSchema.ts diff --git a/src/Website-v1/src/services/posts/beer-post/types/index.ts b/archive/next-js-web-app/src/services/posts/beer-post/types/index.ts similarity index 100% rename from src/Website-v1/src/services/posts/beer-post/types/index.ts rename to archive/next-js-web-app/src/services/posts/beer-post/types/index.ts diff --git a/src/Website-v1/src/services/posts/beer-style-post/index.ts b/archive/next-js-web-app/src/services/posts/beer-style-post/index.ts similarity index 100% rename from src/Website-v1/src/services/posts/beer-style-post/index.ts rename to archive/next-js-web-app/src/services/posts/beer-style-post/index.ts diff --git a/src/Website-v1/src/services/posts/beer-style-post/schema/BeerStyleQueryResult.ts b/archive/next-js-web-app/src/services/posts/beer-style-post/schema/BeerStyleQueryResult.ts similarity index 100% rename from src/Website-v1/src/services/posts/beer-style-post/schema/BeerStyleQueryResult.ts rename to archive/next-js-web-app/src/services/posts/beer-style-post/schema/BeerStyleQueryResult.ts diff --git a/src/Website-v1/src/services/posts/beer-style-post/schema/CreateBeerStyleValidationSchema.ts b/archive/next-js-web-app/src/services/posts/beer-style-post/schema/CreateBeerStyleValidationSchema.ts similarity index 100% rename from src/Website-v1/src/services/posts/beer-style-post/schema/CreateBeerStyleValidationSchema.ts rename to archive/next-js-web-app/src/services/posts/beer-style-post/schema/CreateBeerStyleValidationSchema.ts diff --git a/src/Website-v1/src/services/posts/beer-style-post/types/index.ts b/archive/next-js-web-app/src/services/posts/beer-style-post/types/index.ts similarity index 100% rename from src/Website-v1/src/services/posts/beer-style-post/types/index.ts rename to archive/next-js-web-app/src/services/posts/beer-style-post/types/index.ts diff --git a/src/Website-v1/src/services/posts/brewery-post/index.ts b/archive/next-js-web-app/src/services/posts/brewery-post/index.ts similarity index 100% rename from src/Website-v1/src/services/posts/brewery-post/index.ts rename to archive/next-js-web-app/src/services/posts/brewery-post/index.ts diff --git a/src/Website-v1/src/services/posts/brewery-post/schema/BreweryPostMapQueryResult.ts b/archive/next-js-web-app/src/services/posts/brewery-post/schema/BreweryPostMapQueryResult.ts similarity index 100% rename from src/Website-v1/src/services/posts/brewery-post/schema/BreweryPostMapQueryResult.ts rename to archive/next-js-web-app/src/services/posts/brewery-post/schema/BreweryPostMapQueryResult.ts diff --git a/src/Website-v1/src/services/posts/brewery-post/schema/BreweryPostQueryResult.ts b/archive/next-js-web-app/src/services/posts/brewery-post/schema/BreweryPostQueryResult.ts similarity index 100% rename from src/Website-v1/src/services/posts/brewery-post/schema/BreweryPostQueryResult.ts rename to archive/next-js-web-app/src/services/posts/brewery-post/schema/BreweryPostQueryResult.ts diff --git a/src/Website-v1/src/services/posts/brewery-post/schema/CreateBreweryPostSchema.ts b/archive/next-js-web-app/src/services/posts/brewery-post/schema/CreateBreweryPostSchema.ts similarity index 100% rename from src/Website-v1/src/services/posts/brewery-post/schema/CreateBreweryPostSchema.ts rename to archive/next-js-web-app/src/services/posts/brewery-post/schema/CreateBreweryPostSchema.ts diff --git a/src/Website-v1/src/services/posts/brewery-post/schema/CreateNewBreweryPostWithoutLocationSchema.ts b/archive/next-js-web-app/src/services/posts/brewery-post/schema/CreateNewBreweryPostWithoutLocationSchema.ts similarity index 100% rename from src/Website-v1/src/services/posts/brewery-post/schema/CreateNewBreweryPostWithoutLocationSchema.ts rename to archive/next-js-web-app/src/services/posts/brewery-post/schema/CreateNewBreweryPostWithoutLocationSchema.ts diff --git a/src/Website-v1/src/services/posts/brewery-post/schema/EditBreweryPostValidationSchema.ts b/archive/next-js-web-app/src/services/posts/brewery-post/schema/EditBreweryPostValidationSchema.ts similarity index 100% rename from src/Website-v1/src/services/posts/brewery-post/schema/EditBreweryPostValidationSchema.ts rename to archive/next-js-web-app/src/services/posts/brewery-post/schema/EditBreweryPostValidationSchema.ts diff --git a/src/Website-v1/src/services/posts/brewery-post/schema/GetMapBreweryPostsSchema.ts b/archive/next-js-web-app/src/services/posts/brewery-post/schema/GetMapBreweryPostsSchema.ts similarity index 100% rename from src/Website-v1/src/services/posts/brewery-post/schema/GetMapBreweryPostsSchema.ts rename to archive/next-js-web-app/src/services/posts/brewery-post/schema/GetMapBreweryPostsSchema.ts diff --git a/src/Website-v1/src/services/posts/brewery-post/types/index.ts b/archive/next-js-web-app/src/services/posts/brewery-post/types/index.ts similarity index 100% rename from src/Website-v1/src/services/posts/brewery-post/types/index.ts rename to archive/next-js-web-app/src/services/posts/brewery-post/types/index.ts diff --git a/src/Website-v1/src/services/schema/CommentSchema/CommentQueryResult.ts b/archive/next-js-web-app/src/services/schema/CommentSchema/CommentQueryResult.ts similarity index 100% rename from src/Website-v1/src/services/schema/CommentSchema/CommentQueryResult.ts rename to archive/next-js-web-app/src/services/schema/CommentSchema/CommentQueryResult.ts diff --git a/src/Website-v1/src/services/schema/CommentSchema/CreateCommentValidationSchema.ts b/archive/next-js-web-app/src/services/schema/CommentSchema/CreateCommentValidationSchema.ts similarity index 100% rename from src/Website-v1/src/services/schema/CommentSchema/CreateCommentValidationSchema.ts rename to archive/next-js-web-app/src/services/schema/CommentSchema/CreateCommentValidationSchema.ts diff --git a/src/Website-v1/src/services/schema/ImageSchema/ImageMetadataValidationSchema.ts b/archive/next-js-web-app/src/services/schema/ImageSchema/ImageMetadataValidationSchema.ts similarity index 100% rename from src/Website-v1/src/services/schema/ImageSchema/ImageMetadataValidationSchema.ts rename to archive/next-js-web-app/src/services/schema/ImageSchema/ImageMetadataValidationSchema.ts diff --git a/src/Website-v1/src/services/schema/ImageSchema/ImageQueryValidationSchema.ts b/archive/next-js-web-app/src/services/schema/ImageSchema/ImageQueryValidationSchema.ts similarity index 100% rename from src/Website-v1/src/services/schema/ImageSchema/ImageQueryValidationSchema.ts rename to archive/next-js-web-app/src/services/schema/ImageSchema/ImageQueryValidationSchema.ts diff --git a/src/Website-v1/src/services/schema/ImageSchema/UploadImageValidationSchema.ts b/archive/next-js-web-app/src/services/schema/ImageSchema/UploadImageValidationSchema.ts similarity index 100% rename from src/Website-v1/src/services/schema/ImageSchema/UploadImageValidationSchema.ts rename to archive/next-js-web-app/src/services/schema/ImageSchema/UploadImageValidationSchema.ts diff --git a/src/Website-v1/src/services/schema/PaginatedQueryResponseSchema.ts b/archive/next-js-web-app/src/services/schema/PaginatedQueryResponseSchema.ts similarity index 100% rename from src/Website-v1/src/services/schema/PaginatedQueryResponseSchema.ts rename to archive/next-js-web-app/src/services/schema/PaginatedQueryResponseSchema.ts diff --git a/src/Website-v1/src/services/users/auth/index.ts b/archive/next-js-web-app/src/services/users/auth/index.ts similarity index 100% rename from src/Website-v1/src/services/users/auth/index.ts rename to archive/next-js-web-app/src/services/users/auth/index.ts diff --git a/src/Website-v1/src/services/users/auth/schema/CreateUserValidationSchemas.ts b/archive/next-js-web-app/src/services/users/auth/schema/CreateUserValidationSchemas.ts similarity index 100% rename from src/Website-v1/src/services/users/auth/schema/CreateUserValidationSchemas.ts rename to archive/next-js-web-app/src/services/users/auth/schema/CreateUserValidationSchemas.ts diff --git a/src/Website-v1/src/services/users/auth/schema/EditUserSchema.ts b/archive/next-js-web-app/src/services/users/auth/schema/EditUserSchema.ts similarity index 100% rename from src/Website-v1/src/services/users/auth/schema/EditUserSchema.ts rename to archive/next-js-web-app/src/services/users/auth/schema/EditUserSchema.ts diff --git a/src/Website-v1/src/services/users/auth/schema/GetUserSchema.ts b/archive/next-js-web-app/src/services/users/auth/schema/GetUserSchema.ts similarity index 100% rename from src/Website-v1/src/services/users/auth/schema/GetUserSchema.ts rename to archive/next-js-web-app/src/services/users/auth/schema/GetUserSchema.ts diff --git a/src/Website-v1/src/services/users/auth/schema/LoginValidationSchema.ts b/archive/next-js-web-app/src/services/users/auth/schema/LoginValidationSchema.ts similarity index 100% rename from src/Website-v1/src/services/users/auth/schema/LoginValidationSchema.ts rename to archive/next-js-web-app/src/services/users/auth/schema/LoginValidationSchema.ts diff --git a/src/Website-v1/src/services/users/auth/schema/TokenValidationSchema.ts b/archive/next-js-web-app/src/services/users/auth/schema/TokenValidationSchema.ts similarity index 100% rename from src/Website-v1/src/services/users/auth/schema/TokenValidationSchema.ts rename to archive/next-js-web-app/src/services/users/auth/schema/TokenValidationSchema.ts diff --git a/src/Website-v1/src/services/users/auth/schema/UpdateProfileSchema.ts b/archive/next-js-web-app/src/services/users/auth/schema/UpdateProfileSchema.ts similarity index 100% rename from src/Website-v1/src/services/users/auth/schema/UpdateProfileSchema.ts rename to archive/next-js-web-app/src/services/users/auth/schema/UpdateProfileSchema.ts diff --git a/src/Website-v1/src/services/users/auth/types/index.ts b/archive/next-js-web-app/src/services/users/auth/types/index.ts similarity index 100% rename from src/Website-v1/src/services/users/auth/types/index.ts rename to archive/next-js-web-app/src/services/users/auth/types/index.ts diff --git a/src/Website-v1/src/services/users/profile/index.ts b/archive/next-js-web-app/src/services/users/profile/index.ts similarity index 100% rename from src/Website-v1/src/services/users/profile/index.ts rename to archive/next-js-web-app/src/services/users/profile/index.ts diff --git a/src/Website-v1/src/services/users/profile/schema/FollowInfoSchema.ts b/archive/next-js-web-app/src/services/users/profile/schema/FollowInfoSchema.ts similarity index 100% rename from src/Website-v1/src/services/users/profile/schema/FollowInfoSchema.ts rename to archive/next-js-web-app/src/services/users/profile/schema/FollowInfoSchema.ts diff --git a/src/Website-v1/src/services/users/profile/types/index.ts b/archive/next-js-web-app/src/services/users/profile/types/index.ts similarity index 100% rename from src/Website-v1/src/services/users/profile/types/index.ts rename to archive/next-js-web-app/src/services/users/profile/types/index.ts diff --git a/src/Website-v1/src/styles/globals.css b/archive/next-js-web-app/src/styles/globals.css similarity index 100% rename from src/Website-v1/src/styles/globals.css rename to archive/next-js-web-app/src/styles/globals.css diff --git a/src/Website-v1/src/util/createErrorToast.ts b/archive/next-js-web-app/src/util/createErrorToast.ts similarity index 100% rename from src/Website-v1/src/util/createErrorToast.ts rename to archive/next-js-web-app/src/util/createErrorToast.ts diff --git a/src/Website-v1/src/util/withPageAuthRequired.ts b/archive/next-js-web-app/src/util/withPageAuthRequired.ts similarity index 100% rename from src/Website-v1/src/util/withPageAuthRequired.ts rename to archive/next-js-web-app/src/util/withPageAuthRequired.ts diff --git a/src/Website-v1/src/validation/APIResponseValidationSchema.ts b/archive/next-js-web-app/src/validation/APIResponseValidationSchema.ts similarity index 100% rename from src/Website-v1/src/validation/APIResponseValidationSchema.ts rename to archive/next-js-web-app/src/validation/APIResponseValidationSchema.ts diff --git a/src/Website-v1/tailwind.config.js b/archive/next-js-web-app/tailwind.config.js similarity index 100% rename from src/Website-v1/tailwind.config.js rename to archive/next-js-web-app/tailwind.config.js diff --git a/src/Website-v1/tsconfig.json b/archive/next-js-web-app/tsconfig.json similarity index 100% rename from src/Website-v1/tsconfig.json rename to archive/next-js-web-app/tsconfig.json diff --git a/src/Website-v1/vercel.json b/archive/next-js-web-app/vercel.json similarity index 100% rename from src/Website-v1/vercel.json rename to archive/next-js-web-app/vercel.json