Skip to content

Implement PATCH method for partial updates #318

@nanotaboada

Description

@nanotaboada

Problem

The API supports PUT for player updates, which requires sending the complete player payload even when only one or two fields need to change. A PATCH endpoint would allow callers to update specific fields without providing the entire resource.

Proposed Solution

Add PATCH /players/{squadNumber} for partial updates (following the existing PUT and DELETE URL convention in this repo).

  • All fields are patchable except squadNumber (natural key, present in the URL path) and id (UUID surrogate key).
  • Only the fields present in the request body are updated; absent fields retain their current values.
  • If the request body includes squadNumber or id, the endpoint returns 400 Bad Request.

Suggested Approach

  1. DTO — Add PlayerPatchDTO in the models package with all patchable fields as nullable (e.g. String, Boolean). Exclude squadNumber and id. Annotate with @JsonInclude(JsonInclude.Include.NON_NULL) so absent fields serialize cleanly.
  2. Service — Add boolean patch(Integer squadNumber, PlayerPatchDTO dto) in PlayersService. Retrieve the existing player, apply only the non-null fields from the DTO, then persist.
  3. Controller — Add @PatchMapping("/players/{squadNumber}") in PlayersController. Check for forbidden fields (squadNumber, id) → 400. Look up player → 404 if missing. Return ResponseEntity<Void> with HttpStatus.NO_CONTENT on success.
  4. Tests — Add unit tests following existing naming conventions.

Acceptance Criteria

  • PATCH /players/{squadNumber} is implemented
  • All fields except squadNumber and id are patchable
  • Fields absent from the request body are left unchanged
  • Returns 204 No Content on success
  • Returns 400 Bad Request if the body contains squadNumber or id
  • Returns 400 Bad Request on field validation failure
  • Returns 404 Not Found when no player has that squad number
  • Tests added following existing naming conventions
  • All existing tests continue to pass
  • CHANGELOG.md updated

References

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or requestjavaPull requests that update Java codepriority:mediumPlanned enhancement. Queue for upcoming work.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions