From ffa51cfce441894c3f7e8b7b0772812b28c3398e Mon Sep 17 00:00:00 2001 From: gamer147 Date: Sat, 22 Nov 2025 00:33:06 -0500 Subject: [PATCH 1/3] [FA-13] Adds Fusion gateway, need to setup a local build and stitch process. Only NovelService included right now. --- .../Controllers/TestController.cs | 75 ------------------- FictionArchive.API/FictionArchive.API.csproj | 6 +- FictionArchive.API/Program.cs | 38 ++++------ .../Properties/launchSettings.json | 2 +- ...FictionArchive.Service.NovelService.csproj | 1 + .../Program.cs | 2 + .../subgraph-config.json | 6 ++ .../Extensions/GraphQLExtensions.cs | 26 ++++--- FictionArchive.sln | 5 -- 9 files changed, 45 insertions(+), 116 deletions(-) delete mode 100644 FictionArchive.API/Controllers/TestController.cs create mode 100644 FictionArchive.Service.NovelService/subgraph-config.json diff --git a/FictionArchive.API/Controllers/TestController.cs b/FictionArchive.API/Controllers/TestController.cs deleted file mode 100644 index c6efa45..0000000 --- a/FictionArchive.API/Controllers/TestController.cs +++ /dev/null @@ -1,75 +0,0 @@ -using Microsoft.AspNetCore.Http; -using Microsoft.AspNetCore.Mvc; -using Microsoft.EntityFrameworkCore; - -namespace FictionArchive.API.Controllers -{ - [Route("api/[controller]")] - [ApiController] - public class TestController : ControllerBase - { - /*private readonly FictionArchiveDbContext _dbContext; - private readonly ISourceAdapter _novelpiaAdapter; - private readonly ITranslationEngineAdapter _translationEngine; - - public TestController(ISourceAdapter novelpiaAdapter, FictionArchiveDbContext dbContext, ITranslationEngineAdapter translationEngine) - { - _novelpiaAdapter = novelpiaAdapter; - _dbContext = dbContext; - _translationEngine = translationEngine; - } - - [HttpGet("GetNovel")] - public async Task GetNovel(string novelUrl) - { - var novel = await _novelpiaAdapter.GetMetadata(novelUrl); - novel.Source = new Source() - { - Name = "Novelpia", - Id = 1, - Url = "https://novelpia.com" - }; - _dbContext.Novels.Add(novel); - await _dbContext.SaveChangesAsync(); - return novel; - } - - [HttpGet("GetChapter")] - public async Task GetChapter(uint novelId, uint chapterNumber) - { - var novel = await _dbContext.Novels.Include(n => n.Chapters).ThenInclude(c => c.Translations).FirstOrDefaultAsync(n => n.Id == novelId); - var chapter = novel.Chapters.FirstOrDefault(c => c.Order == chapterNumber); - var rawChapter = await _novelpiaAdapter.GetRawChapter(chapter.Url); - chapter.Translations.Add(new ChapterTranslation() - { - Language = novel.RawLanguage, - Body = rawChapter - }); - await _dbContext.SaveChangesAsync(); - return rawChapter; - } - - [HttpPost("TranslateChapter")] - public async Task TranslateChapter(uint novelId, uint chapterNumber, Language to) - { - var novel = await _dbContext.Novels.Include(n => n.Chapters) - .ThenInclude(c => c.Translations).FirstOrDefaultAsync(novel => novel.Id == novelId); - var chapter = novel.Chapters.FirstOrDefault(c => c.Order == chapterNumber); - var chapterRaw = chapter.Translations.FirstOrDefault(ct => ct.Language == novel.RawLanguage); - var newTranslation = new ChapterTranslation() - { - Language = to, - TranslationEngine = new TranslationEngine() - { - Name = "DeepL" - } - }; - var translation = await _translationEngine.GetTranslation(chapterRaw.Body, novel.RawLanguage, to); - newTranslation.Body = translation; - chapter.Translations.Add(newTranslation); - await _dbContext.SaveChangesAsync(); - - return newTranslation; - }*/ - } -} diff --git a/FictionArchive.API/FictionArchive.API.csproj b/FictionArchive.API/FictionArchive.API.csproj index aafc33d..4246f74 100644 --- a/FictionArchive.API/FictionArchive.API.csproj +++ b/FictionArchive.API/FictionArchive.API.csproj @@ -11,6 +11,7 @@ + all @@ -28,8 +29,11 @@ - + + + + diff --git a/FictionArchive.API/Program.cs b/FictionArchive.API/Program.cs index cdf2123..4a95395 100644 --- a/FictionArchive.API/Program.cs +++ b/FictionArchive.API/Program.cs @@ -1,3 +1,5 @@ +using FictionArchive.Service.Shared.Extensions; + namespace FictionArchive.API; public class Program @@ -6,38 +8,26 @@ public class Program { var builder = WebApplication.CreateBuilder(args); - // Add services to the container. - - // OpenAPI & REST - builder.Services.AddControllers(); - // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle - builder.Services.AddEndpointsApiExplorer(); - builder.Services.AddSwaggerGen(); - - builder.Services.AddMemoryCache(); - builder.Services.AddHealthChecks(); + + #region Fusion Gateway + + builder.Services.AddHttpClient("Fusion"); + + builder.Services + .AddFusionGatewayServer() + .ConfigureFromFile("gateway.fgp") + .CoreBuilder.ApplySaneDefaults(); + + #endregion var app = builder.Build(); - // Configure the HTTP request pipeline. - if (app.Environment.IsDevelopment()) - { - app.UseSwagger(); - app.UseSwaggerUI(); - } - app.UseHttpsRedirection(); - - app.UseAuthentication(); - - app.UseAuthorization(); - - app.MapGraphQL(); app.MapHealthChecks("/healthz"); - app.MapControllers(); + app.MapGraphQL(); app.Run(); } diff --git a/FictionArchive.API/Properties/launchSettings.json b/FictionArchive.API/Properties/launchSettings.json index dddb254..651e411 100644 --- a/FictionArchive.API/Properties/launchSettings.json +++ b/FictionArchive.API/Properties/launchSettings.json @@ -23,7 +23,7 @@ "commandName": "Project", "dotnetRunMessages": true, "launchBrowser": true, - "launchUrl": "swagger", + "launchUrl": "graphql", "applicationUrl": "https://localhost:7063;http://localhost:5234", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" diff --git a/FictionArchive.Service.NovelService/FictionArchive.Service.NovelService.csproj b/FictionArchive.Service.NovelService/FictionArchive.Service.NovelService.csproj index 2d82c93..ac56df2 100644 --- a/FictionArchive.Service.NovelService/FictionArchive.Service.NovelService.csproj +++ b/FictionArchive.Service.NovelService/FictionArchive.Service.NovelService.csproj @@ -8,6 +8,7 @@ + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/FictionArchive.Service.NovelService/Program.cs b/FictionArchive.Service.NovelService/Program.cs index 79fa235..5592c15 100644 --- a/FictionArchive.Service.NovelService/Program.cs +++ b/FictionArchive.Service.NovelService/Program.cs @@ -76,6 +76,8 @@ public class Program app.MapHealthChecks("/healthz"); app.MapGraphQL(); + + app.RunWithGraphQLCommands(args); app.Run(); } diff --git a/FictionArchive.Service.NovelService/subgraph-config.json b/FictionArchive.Service.NovelService/subgraph-config.json new file mode 100644 index 0000000..0d9b586 --- /dev/null +++ b/FictionArchive.Service.NovelService/subgraph-config.json @@ -0,0 +1,6 @@ +{ + "subgraph": "Novels", + "http": { + "baseAddress": "http://localhost:5101/graphql" + } +} \ No newline at end of file diff --git a/FictionArchive.Service.Shared/Extensions/GraphQLExtensions.cs b/FictionArchive.Service.Shared/Extensions/GraphQLExtensions.cs index b51551a..d329975 100644 --- a/FictionArchive.Service.Shared/Extensions/GraphQLExtensions.cs +++ b/FictionArchive.Service.Shared/Extensions/GraphQLExtensions.cs @@ -10,15 +10,21 @@ public static class GraphQLExtensions public static IRequestExecutorBuilder AddDefaultGraphQl(this IServiceCollection services) where TQuery : class where TMutation : class { return services.AddGraphQLServer() - .AddQueryType() - .AddMutationType() - .AddDiagnosticEventListener() - .AddErrorFilter() - .AddType() - .AddType() - .AddMutationConventions(applyToAllMutations: true) - .AddFiltering(opt => opt.AddDefaults().BindRuntimeType()) - .AddSorting() - .AddProjections(); + .AddQueryType() + .AddMutationType() + .ApplySaneDefaults(); + + } + + public static IRequestExecutorBuilder ApplySaneDefaults(this IRequestExecutorBuilder builder) + { + return builder.AddDiagnosticEventListener() + .AddErrorFilter() + .AddType() + .AddType() + .AddMutationConventions(applyToAllMutations: true) + .AddFiltering(opt => opt.AddDefaults().BindRuntimeType()) + .AddSorting() + .AddProjections(); } } \ No newline at end of file diff --git a/FictionArchive.sln b/FictionArchive.sln index e999c3b..cee3dc2 100644 --- a/FictionArchive.sln +++ b/FictionArchive.sln @@ -16,11 +16,6 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FictionArchive.Service.User EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FictionArchive.Service.AuthenticationService", "FictionArchive.Service.AuthenticationService\FictionArchive.Service.AuthenticationService.csproj", "{70C4AE82-B01E-421D-B590-C0F47E63CD0C}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{35C67E32-A17F-4EAB-B141-88AFCE11FF9C}" - ProjectSection(SolutionItems) = preProject - compose.yaml = compose.yaml - EndProjectSection -EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU -- 2.49.1 From ceb42711829ab4141dc042726985f593f39ab89f Mon Sep 17 00:00:00 2001 From: gamer147 Date: Sat, 22 Nov 2025 00:33:34 -0500 Subject: [PATCH 2/3] [FA-13] Forgot gateway schema --- FictionArchive.API/gateway.fgp | Bin 0 -> 50383 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 FictionArchive.API/gateway.fgp diff --git a/FictionArchive.API/gateway.fgp b/FictionArchive.API/gateway.fgp new file mode 100644 index 0000000000000000000000000000000000000000..fd770ebf8cd1db8c585432fd36ff3fcbd42a5881 GIT binary patch literal 50383 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 Uk7B)-!vF4thqyoXS^U@k0~s*VcmMzZ literal 0 HcmV?d00001 -- 2.49.1 From df7978fb4348d52f90b0af45bb32d77d37210389 Mon Sep 17 00:00:00 2001 From: gamer147 Date: Sat, 22 Nov 2025 18:14:01 -0500 Subject: [PATCH 3/3] [FA-13] Works locally, probably works in CICD --- FictionArchive.API/build_gateway.bat | 99 +++++++++++++++++ FictionArchive.API/build_gateway.sh | 104 ++++++++++++++++++ FictionArchive.API/gateway.fgp | Bin 50383 -> 84122 bytes .../Program.cs | 4 +- .../Program.cs | 2 +- .../subgraph-config.json | 6 + .../FictionArchive.Service.Shared.csproj | 1 + ....cs => 20251122225458_Initial.Designer.cs} | 9 +- ...2_Initial.cs => 20251122225458_Initial.cs} | 7 +- ...ranslationServiceDbContextModelSnapshot.cs | 7 +- .../Program.cs | 2 +- .../subgraph-config.json | 6 + FictionArchive.Service.UserService/Program.cs | 2 +- .../subgraph-config.json | 6 + 14 files changed, 236 insertions(+), 19 deletions(-) create mode 100644 FictionArchive.API/build_gateway.bat create mode 100644 FictionArchive.API/build_gateway.sh create mode 100644 FictionArchive.Service.SchedulerService/subgraph-config.json rename FictionArchive.Service.TranslationService/Migrations/{20251118052322_Initial.Designer.cs => 20251122225458_Initial.Designer.cs} (90%) rename FictionArchive.Service.TranslationService/Migrations/{20251118052322_Initial.cs => 20251122225458_Initial.cs} (84%) create mode 100644 FictionArchive.Service.TranslationService/subgraph-config.json create mode 100644 FictionArchive.Service.UserService/subgraph-config.json diff --git a/FictionArchive.API/build_gateway.bat b/FictionArchive.API/build_gateway.bat new file mode 100644 index 0000000..598d0e6 --- /dev/null +++ b/FictionArchive.API/build_gateway.bat @@ -0,0 +1,99 @@ +@echo off +setlocal enabledelayedexpansion + +set ROOT=%~dp0 + +for %%A in ("%ROOT%..") do set SERVICES_DIR=%%~fA\ + +REM ---------------------------------------- +REM List of project names to skip +REM (space-separated, match folder names exactly) +REM ---------------------------------------- +set SKIP_PROJECTS=FictionArchive.Service.Shared FictionArchive.Service.AuthenticationService + +echo ---------------------------------------- +echo Finding GraphQL services... +echo ---------------------------------------- + +set SERVICE_LIST= + +for /d %%F in ("%SERVICES_DIR%FictionArchive.Service.*") do ( + set "PROJECT_NAME=%%~nxF" + set "SKIP=0" + + REM Check if this project name is in the skip list + for %%X in (%SKIP_PROJECTS%) do ( + if /I "!PROJECT_NAME!"=="%%X" ( + set "SKIP=1" + ) + ) + + if !SKIP!==0 ( + echo Found service: !PROJECT_NAME! + set SERVICE_LIST=!SERVICE_LIST! %%F + ) else ( + echo Skipping service: !PROJECT_NAME! + ) +) + +echo: +echo ---------------------------------------- +echo Exporting schemas and packing subgraphs... +echo ---------------------------------------- + +for %%S in (%SERVICE_LIST%) do ( + echo Processing service folder: %%S + pushd "%%S" + + echo Running schema export... + dotnet run -- schema export --output schema.graphql + if errorlevel 1 ( + echo ERROR during schema export in %%S + popd + exit /b 1 + ) + + echo Running fusion subgraph pack... + fusion subgraph pack + if errorlevel 1 ( + echo ERROR during subgraph pack in %%S + popd + exit /b 1 + ) + + popd + echo Completed: %%S + echo. +) + +echo ---------------------------------------- +echo Running fusion compose... +echo ---------------------------------------- + +pushd "%ROOT%" + +if exist gateway.fgp del gateway.fgp + +for %%S in (%SERVICE_LIST%) do ( + REM Extract the full folder name WITH dots preserved + set "SERVICE_NAME=%%~nxS" + + echo Composing subgraph: !SERVICE_NAME! + + fusion compose -p gateway.fgp -s "..\!SERVICE_NAME!" + if errorlevel 1 ( + echo ERROR during fusion compose + popd + exit /b 1 + ) +) + +popd + + +echo ---------------------------------------- +echo Fusion build complete! +echo ---------------------------------------- + +endlocal +exit /b 0 diff --git a/FictionArchive.API/build_gateway.sh b/FictionArchive.API/build_gateway.sh new file mode 100644 index 0000000..f6ed69a --- /dev/null +++ b/FictionArchive.API/build_gateway.sh @@ -0,0 +1,104 @@ +#!/usr/bin/env bash +set -euo pipefail + +############################################### +# Resolve important directories +############################################### + +# Directory where this script lives +ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" + +# Services live one directory above the script's directory +SERVICES_DIR="$(cd "$ROOT/.." && pwd)" + +############################################### +# Skip list (folder names, match exactly) +############################################### +SKIP_PROJECTS=( + "FictionArchive.Service.Shared" + "FictionArchive.Service.Legacy" +) + +echo "----------------------------------------" +echo " Finding GraphQL services..." +echo "----------------------------------------" + +SERVICE_LIST=() + +# Convert skip projects into a single searchable string +SKIP_STRING=" ${SKIP_PROJECTS[*]} " + +# Find service directories +shopt -s nullglob +for FOLDER in "$SERVICES_DIR"/FictionArchive.Service.*; do + [ -d "$FOLDER" ] || continue + + PROJECT_NAME="$(basename "$FOLDER")" + + # Skip entries that match the skip list + if [[ "$SKIP_STRING" == *" $PROJECT_NAME "* ]]; then + echo "Skipping service: $PROJECT_NAME" + continue + fi + + echo "Found service: $PROJECT_NAME" + SERVICE_LIST+=("$FOLDER") +done +shopt -u nullglob + +echo +echo "----------------------------------------" +echo " Exporting schemas and packing subgraphs..." +echo "----------------------------------------" + +for SERVICE in "${SERVICE_LIST[@]}"; do + PROJECT_NAME="$(basename "$SERVICE")" + + echo "Processing service: $PROJECT_NAME" + pushd "$SERVICE" >/dev/null + + echo "Building service..." + dotnet build -c Release >/dev/null + + # Automatically detect built DLL in bin/Release// + DLL_PATH="$(find "bin/Release" -maxdepth 3 -name '*.dll' | head -n 1)" + if [[ -z "$DLL_PATH" ]]; then + echo "ERROR: Could not locate DLL for $PROJECT_NAME" + popd >/dev/null + exit 1 + fi + + echo "Running schema export..." + dotnet exec "$DLL_PATH" schema export --output schema.graphql + + echo "Running subgraph pack..." + fusion subgraph pack + + popd >/dev/null + echo "Completed: $PROJECT_NAME" + echo +done + +echo "----------------------------------------" +echo " Running fusion compose..." +echo "----------------------------------------" + +pushd "$ROOT" >/dev/null + +# Remove old composition file +rm -f gateway.fgp + +for SERVICE in "${SERVICE_LIST[@]}"; do + SERVICE_NAME="$(basename "$SERVICE")" + + echo "Composing subgraph: $SERVICE_NAME" + + # Note: Fusion compose must reference parent dir (services live above ROOT) + fusion compose -p gateway.fgp -s "../$SERVICE_NAME" +done + +popd >/dev/null + +echo "----------------------------------------" +echo " Fusion build complete!" +echo "----------------------------------------" diff --git a/FictionArchive.API/gateway.fgp b/FictionArchive.API/gateway.fgp index fd770ebf8cd1db8c585432fd36ff3fcbd42a5881..4eb467af15b78d7f444c422f55154aeda0b3a82a 100644 GIT binary patch literal 84122 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 E2NWUzw*UYD delta 775 zcmah`T}abW6u;+g(|wp$n{%eNFV_-jI+!UEMd?DD;glBSFi|s?Ot%#6!>Ev9A4s4F z{8J#=g9JrJ-pVMjk_e%kJ@lfh9)r*aiAH9I-TzQDU%D6Wx#!&9Irsd2=T@(5>Y7C7 zc1fffBCZg0c)#wi__0_*$YKfJlMdoQ+&*Tx&_r=LIR%rHo7s$FfeNiE(BVi*I-Apa zDYB3qH|;Xw3u_?;b`G;beHmc4u?w3_=kT2+fql#zR^o}=Ogw(00yA=r{N9hrIa`D= zE$qdBU5^2ql8xCNz#@6ofL~^k@N!=&e#oC-Zw}l6oc*L{kBg&fT%LC@Lshwq8Ag?W zJwH9H#%GY?kl%{m{Z{I#MEhlKM2({JUI zS!zm%nm*DcQz0OSR2l+iJzob>IoAU3N}@4f)!EtbQ~@DV1$eXb7?;CG(OoMO&Zs~w zs(^Faqxh@KBL>;CP(I+pa2P*lrm`njJ@FXHv*4eQ1|RfgW6O0pF7;-wFs#Nykv$_t z4gVpyEWxz#=~&~uLA?FGQ|vQ+(pkvuXnj0nfbgmal$ZXUA0dgcsjfdxwzr)MwAdP3 zYlFViezyy#hOEtgO%Xy=>(j`NQbKB48~klKHu2n;IPF}}IY3K@1IS9f)$}@-Fjx!* zlc;Eix4BXge#@WgIZnL_iP?!V!CVYRlZaXqd?SaKhY1maPT0no_d6k7`n;PE1ezvn sKL`mtD3tOj&A%cvI>9XZJ=~XEd`*P=PRP>8;>6G7d~5jRhsH(kFD{kzQ~&?~ diff --git a/FictionArchive.Service.NovelService/Program.cs b/FictionArchive.Service.NovelService/Program.cs index 5592c15..233118f 100644 --- a/FictionArchive.Service.NovelService/Program.cs +++ b/FictionArchive.Service.NovelService/Program.cs @@ -76,9 +76,7 @@ public class Program app.MapHealthChecks("/healthz"); app.MapGraphQL(); - - app.RunWithGraphQLCommands(args); - app.Run(); + app.RunWithGraphQLCommands(args); } } \ No newline at end of file diff --git a/FictionArchive.Service.SchedulerService/Program.cs b/FictionArchive.Service.SchedulerService/Program.cs index 1710637..9d40de1 100644 --- a/FictionArchive.Service.SchedulerService/Program.cs +++ b/FictionArchive.Service.SchedulerService/Program.cs @@ -69,6 +69,6 @@ public class Program app.MapGraphQL(); - app.Run(); + app.RunWithGraphQLCommands(args); } } \ No newline at end of file diff --git a/FictionArchive.Service.SchedulerService/subgraph-config.json b/FictionArchive.Service.SchedulerService/subgraph-config.json new file mode 100644 index 0000000..146a0b6 --- /dev/null +++ b/FictionArchive.Service.SchedulerService/subgraph-config.json @@ -0,0 +1,6 @@ +{ + "subgraph": "Scheduler", + "http": { + "baseAddress": "http://localhost:5213/graphql" + } +} \ No newline at end of file diff --git a/FictionArchive.Service.Shared/FictionArchive.Service.Shared.csproj b/FictionArchive.Service.Shared/FictionArchive.Service.Shared.csproj index e27a5be..da7c156 100644 --- a/FictionArchive.Service.Shared/FictionArchive.Service.Shared.csproj +++ b/FictionArchive.Service.Shared/FictionArchive.Service.Shared.csproj @@ -9,6 +9,7 @@ + diff --git a/FictionArchive.Service.TranslationService/Migrations/20251118052322_Initial.Designer.cs b/FictionArchive.Service.TranslationService/Migrations/20251122225458_Initial.Designer.cs similarity index 90% rename from FictionArchive.Service.TranslationService/Migrations/20251118052322_Initial.Designer.cs rename to FictionArchive.Service.TranslationService/Migrations/20251122225458_Initial.Designer.cs index e0cb23b..449648b 100644 --- a/FictionArchive.Service.TranslationService/Migrations/20251118052322_Initial.Designer.cs +++ b/FictionArchive.Service.TranslationService/Migrations/20251122225458_Initial.Designer.cs @@ -1,4 +1,5 @@ // +using System; using FictionArchive.Service.TranslationService.Services.Database; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Infrastructure; @@ -12,7 +13,7 @@ using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; namespace FictionArchive.Service.TranslationService.Migrations { [DbContext(typeof(TranslationServiceDbContext))] - [Migration("20251118052322_Initial")] + [Migration("20251122225458_Initial")] partial class Initial { /// @@ -27,11 +28,9 @@ namespace FictionArchive.Service.TranslationService.Migrations modelBuilder.Entity("FictionArchive.Service.TranslationService.Models.Database.TranslationRequest", b => { - b.Property("Id") + b.Property("Id") .ValueGeneratedOnAdd() - .HasColumnType("bigint"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + .HasColumnType("uuid"); b.Property("BilledCharacterCount") .HasColumnType("bigint"); diff --git a/FictionArchive.Service.TranslationService/Migrations/20251118052322_Initial.cs b/FictionArchive.Service.TranslationService/Migrations/20251122225458_Initial.cs similarity index 84% rename from FictionArchive.Service.TranslationService/Migrations/20251118052322_Initial.cs rename to FictionArchive.Service.TranslationService/Migrations/20251122225458_Initial.cs index 4018158..2ea589a 100644 --- a/FictionArchive.Service.TranslationService/Migrations/20251118052322_Initial.cs +++ b/FictionArchive.Service.TranslationService/Migrations/20251122225458_Initial.cs @@ -1,6 +1,6 @@ -using Microsoft.EntityFrameworkCore.Migrations; +using System; +using Microsoft.EntityFrameworkCore.Migrations; using NodaTime; -using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; #nullable disable @@ -16,8 +16,7 @@ namespace FictionArchive.Service.TranslationService.Migrations name: "TranslationRequests", columns: table => new { - Id = table.Column(type: "bigint", nullable: false) - .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), + Id = table.Column(type: "uuid", nullable: false), OriginalText = table.Column(type: "text", nullable: false), TranslatedText = table.Column(type: "text", nullable: true), From = table.Column(type: "integer", nullable: false), diff --git a/FictionArchive.Service.TranslationService/Migrations/TranslationServiceDbContextModelSnapshot.cs b/FictionArchive.Service.TranslationService/Migrations/TranslationServiceDbContextModelSnapshot.cs index d06ce38..3a18060 100644 --- a/FictionArchive.Service.TranslationService/Migrations/TranslationServiceDbContextModelSnapshot.cs +++ b/FictionArchive.Service.TranslationService/Migrations/TranslationServiceDbContextModelSnapshot.cs @@ -1,4 +1,5 @@ // +using System; using FictionArchive.Service.TranslationService.Services.Database; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Infrastructure; @@ -24,11 +25,9 @@ namespace FictionArchive.Service.TranslationService.Migrations modelBuilder.Entity("FictionArchive.Service.TranslationService.Models.Database.TranslationRequest", b => { - b.Property("Id") + b.Property("Id") .ValueGeneratedOnAdd() - .HasColumnType("bigint"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + .HasColumnType("uuid"); b.Property("BilledCharacterCount") .HasColumnType("bigint"); diff --git a/FictionArchive.Service.TranslationService/Program.cs b/FictionArchive.Service.TranslationService/Program.cs index 4a632bb..3fb305c 100644 --- a/FictionArchive.Service.TranslationService/Program.cs +++ b/FictionArchive.Service.TranslationService/Program.cs @@ -73,6 +73,6 @@ public class Program app.MapGraphQL(); - app.Run(); + app.RunWithGraphQLCommands(args); } } \ No newline at end of file diff --git a/FictionArchive.Service.TranslationService/subgraph-config.json b/FictionArchive.Service.TranslationService/subgraph-config.json new file mode 100644 index 0000000..5a031b3 --- /dev/null +++ b/FictionArchive.Service.TranslationService/subgraph-config.json @@ -0,0 +1,6 @@ +{ + "subgraph": "Translation", + "http": { + "baseAddress": "http://localhost:5234/graphql" + } +} \ No newline at end of file diff --git a/FictionArchive.Service.UserService/Program.cs b/FictionArchive.Service.UserService/Program.cs index fa035a4..13c397d 100644 --- a/FictionArchive.Service.UserService/Program.cs +++ b/FictionArchive.Service.UserService/Program.cs @@ -47,6 +47,6 @@ public class Program app.MapHealthChecks("/healthz"); - app.Run(); + app.RunWithGraphQLCommands(args); } } \ No newline at end of file diff --git a/FictionArchive.Service.UserService/subgraph-config.json b/FictionArchive.Service.UserService/subgraph-config.json new file mode 100644 index 0000000..38e8311 --- /dev/null +++ b/FictionArchive.Service.UserService/subgraph-config.json @@ -0,0 +1,6 @@ +{ + "subgraph": "User", + "http": { + "baseAddress": "http://localhost:5145/graphql" + } +} \ No newline at end of file -- 2.49.1