[Refactoring] Toter Code, doppelte Logik und uneinheitliche Routen #58

Closed
opened 2026-09-09 20:17:04 +00:00 by Aceless · 1 comment
Owner

Toter und ueberfluessiger Code

  • SpaceRepository.GetUserRoleAsync wird nirgends aufgerufen und dupliziert EnsureUserHasRoleAsync.
  • SpaceRepository.CreateSpaceAsync: var uuid = userId.ToString(); wird nie verwendet.
  • Dtos/SearchDtos.cs gehoert zu keinem Endpunkt.
  • RecipeRepository.CreateRecipeInSpace und MealPlanRepository.AddEntry verwenden RETURNING * in Verbindung mit ExecuteAsync, das Ergebnis wird verworfen.
  • RecipeRepository.GetRecipeInSpace enthaelt einen Kommentarblock, der eine Ueberlegung dokumentiert statt einer Entscheidung. Analog MealPlanRepository.UpdateEntry mit rund 25 Zeilen offener Diskussion im Code.
  • RecipePlannerApi.http enthaelt noch den weatherforecast-Aufruf aus der Projektvorlage.
  • RecipeMappingExtensions: recipe.Images.Select(...).ToList() ?? [] - der Null-Coalescing-Teil ist unerreichbar, da ToList() nie null liefert.

Doppelte Logik

CheckSpaceAccess existiert wortgleich in RecipeRepository und MealPlanRepository, inklusive des Stringvergleichs role == "viewer". Kommt eine Rolle dazu, muss man beide Stellen finden. Vorschlag: eine gemeinsame Komponente (z. B. ISpaceAccessService) mit einem Enum statt Strings, genutzt von allen Repositories.

Routen

SpaceController liegt unter api/[controller], die Klasse heisst SpaceController, die Route ist also /api/Space. Alle untergeordneten Controller nutzen api/spaces/{spaceId}/.... Im Flutter-Client steht dazu bereits ein Kommentar:

final response = await _api.get('/api/space'); // Check route: SpacesController route is api/[controller] -> api/Space

Vorschlag: feste Route [Route("api/spaces")] setzen und die App entsprechend anpassen. Ausserdem liegen die Controller teils im Namespace RecipePlannerApi.Controller, teils in RecipePlannerApi.Controllers - vereinheitlichen.

Nebenpunkt

app.UseHttpsRedirection() steht in Program.cs, waehrend der Container nur HTTP auf 8080 bereitstellt und die App http://192.168.1.104:5261 anspricht. Entweder TLS am Reverse Proxy terminieren und die Weiterleitung entfernen, oder HTTPS durchgaengig konfigurieren.

## Toter und ueberfluessiger Code - `SpaceRepository.GetUserRoleAsync` wird nirgends aufgerufen und dupliziert `EnsureUserHasRoleAsync`. - `SpaceRepository.CreateSpaceAsync`: `var uuid = userId.ToString();` wird nie verwendet. - `Dtos/SearchDtos.cs` gehoert zu keinem Endpunkt. - `RecipeRepository.CreateRecipeInSpace` und `MealPlanRepository.AddEntry` verwenden `RETURNING *` in Verbindung mit `ExecuteAsync`, das Ergebnis wird verworfen. - `RecipeRepository.GetRecipeInSpace` enthaelt einen Kommentarblock, der eine Ueberlegung dokumentiert statt einer Entscheidung. Analog `MealPlanRepository.UpdateEntry` mit rund 25 Zeilen offener Diskussion im Code. - `RecipePlannerApi.http` enthaelt noch den `weatherforecast`-Aufruf aus der Projektvorlage. - `RecipeMappingExtensions`: `recipe.Images.Select(...).ToList() ?? []` - der Null-Coalescing-Teil ist unerreichbar, da `ToList()` nie null liefert. ## Doppelte Logik `CheckSpaceAccess` existiert wortgleich in `RecipeRepository` und `MealPlanRepository`, inklusive des Stringvergleichs `role == "viewer"`. Kommt eine Rolle dazu, muss man beide Stellen finden. Vorschlag: eine gemeinsame Komponente (z. B. `ISpaceAccessService`) mit einem Enum statt Strings, genutzt von allen Repositories. ## Routen `SpaceController` liegt unter `api/[controller]`, die Klasse heisst `SpaceController`, die Route ist also `/api/Space`. Alle untergeordneten Controller nutzen `api/spaces/{spaceId}/...`. Im Flutter-Client steht dazu bereits ein Kommentar: ```dart final response = await _api.get('/api/space'); // Check route: SpacesController route is api/[controller] -> api/Space ``` Vorschlag: feste Route `[Route("api/spaces")]` setzen und die App entsprechend anpassen. Ausserdem liegen die Controller teils im Namespace `RecipePlannerApi.Controller`, teils in `RecipePlannerApi.Controllers` - vereinheitlichen. ## Nebenpunkt `app.UseHttpsRedirection()` steht in `Program.cs`, waehrend der Container nur HTTP auf 8080 bereitstellt und die App `http://192.168.1.104:5261` anspricht. Entweder TLS am Reverse Proxy terminieren und die Weiterleitung entfernen, oder HTTPS durchgaengig konfigurieren.
Author
Owner

Erledigt.

Routen: SpaceController liegt jetzt fest auf api/spaces. api/space bleibt als zweites Route-Attribut erhalten, damit bereits ausgelieferte App-Versionen weiterlaufen. Der Kommentar im Code sagt, dass der Alias entfallen kann, sobald keine alten Clients mehr im Umlauf sind. Die App muss dafür nicht angepasst werden.

Namespaces: alle Controller liegen jetzt unter RecipePlannerApi.Controllers.

Doppelte Logik: CheckSpaceAccess gab es wortgleich in zwei Repositories. Beide nutzen jetzt ISpaceAccessService mit einer expliziten Rangfolge statt Stringvergleichen.

Entfernt: GetUserRoleAsync, die ungenutzte Variable uuid, das wirkungslose RETURNING * bei ExecuteAsync, die unerreichbaren ?? [] in den Mapping-Extensions, die rund 25 Zeilen offener Diskussion in UpdateEntry, der weatherforecast-Aufruf in RecipePlannerApi.http und app.UseHttpsRedirection(). TLS gehört an den Reverse Proxy, der Container lauscht nur auf HTTP und die App spricht HTTP.

Die doppelte MapToDto-Methode in den beiden Essensplan-Controllern liegt jetzt als MealPlanMappingExtensions an einer Stelle.

Dtos/SearchDtos.cs bleibt vorerst, das hängt an #52.


Branch backend/issue-fixes, Commits c59a727, 026544c, 1432e1d, 2a1cc95.

Erledigt. **Routen:** `SpaceController` liegt jetzt fest auf `api/spaces`. `api/space` bleibt als zweites Route-Attribut erhalten, damit bereits ausgelieferte App-Versionen weiterlaufen. Der Kommentar im Code sagt, dass der Alias entfallen kann, sobald keine alten Clients mehr im Umlauf sind. Die App muss dafür nicht angepasst werden. **Namespaces:** alle Controller liegen jetzt unter `RecipePlannerApi.Controllers`. **Doppelte Logik:** `CheckSpaceAccess` gab es wortgleich in zwei Repositories. Beide nutzen jetzt `ISpaceAccessService` mit einer expliziten Rangfolge statt Stringvergleichen. **Entfernt:** `GetUserRoleAsync`, die ungenutzte Variable `uuid`, das wirkungslose `RETURNING *` bei `ExecuteAsync`, die unerreichbaren `?? []` in den Mapping-Extensions, die rund 25 Zeilen offener Diskussion in `UpdateEntry`, der `weatherforecast`-Aufruf in `RecipePlannerApi.http` und `app.UseHttpsRedirection()`. TLS gehört an den Reverse Proxy, der Container lauscht nur auf HTTP und die App spricht HTTP. Die doppelte `MapToDto`-Methode in den beiden Essensplan-Controllern liegt jetzt als `MealPlanMappingExtensions` an einer Stelle. `Dtos/SearchDtos.cs` bleibt vorerst, das hängt an #52. --- Branch `backend/issue-fixes`, Commits c59a727, 026544c, 1432e1d, 2a1cc95.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
Aceless/RecipePlanner#58
No description provided.