Standardize API response codes: PUT returns 200, DELETE returns 204 (#112)

* Initial plan

* Fix API response codes: PUT returns 200 Ok, DELETE returns 204 NoContent

Co-authored-by: cheir-mneme <176430037+cheir-mneme@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: cheir-mneme <176430037+cheir-mneme@users.noreply.github.com>
This commit is contained in:
Copilot 2025-12-21 14:39:47 -06:00 committed by GitHub
parent b9a03f0ec3
commit 688a0efaa4
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
12 changed files with 56 additions and 39 deletions

View file

@ -68,9 +68,9 @@ public ActionResult<AutoTaggingResource> Update([FromBody] AutoTaggingResource r
Validate(model);
_autoTaggingService.Update(model);
var updated = _autoTaggingService.Update(model);
return Accepted(model.Id);
return Ok(updated.ToResource());
}
[HttpGet]
@ -81,9 +81,10 @@ public List<AutoTaggingResource> GetAll()
}
[RestDeleteById]
public void DeleteFormat(int id)
public ActionResult DeleteFormat(int id)
{
_autoTaggingService.Delete(id);
return NoContent();
}
[HttpGet("schema")]

View file

@ -63,18 +63,19 @@ public List<BlocklistResource> GetMovieBlocklist(int movieId)
}
[RestDeleteById]
public void DeleteBlocklist(int id)
public ActionResult DeleteBlocklist(int id)
{
_blocklistService.Delete(id);
return NoContent();
}
[HttpDelete("bulk")]
[Produces("application/json")]
public object Remove([FromBody] BlocklistBulkResource resource)
public ActionResult Remove([FromBody] BlocklistBulkResource resource)
{
_blocklistService.Delete(resource.Ids);
return new { };
return NoContent();
}
}
}

View file

@ -41,14 +41,15 @@ public ActionResult<CustomFilterResource> AddCustomFilter([FromBody] CustomFilte
[Consumes("application/json")]
public ActionResult<CustomFilterResource> UpdateCustomFilter([FromBody] CustomFilterResource resource)
{
_customFilterService.Update(resource.ToModel());
return Accepted(resource.Id);
var updated = _customFilterService.Update(resource.ToModel());
return Ok(updated.ToResource());
}
[RestDeleteById]
public void DeleteCustomResource(int id)
public ActionResult DeleteCustomResource(int id)
{
_customFilterService.Delete(id);
return NoContent();
}
}
}

View file

@ -72,9 +72,9 @@ public ActionResult<CustomFormatResource> Update([FromBody] CustomFormatResource
Validate(model);
_formatService.Update(model);
var updated = _formatService.Update(model);
return Accepted(model.Id);
return Ok(updated.ToResource(true));
}
[HttpPut("bulk")]
@ -96,22 +96,23 @@ public virtual ActionResult<CustomFormatResource> Update([FromBody] CustomFormat
_formatService.Update(customFormats);
return Accepted(customFormats.ConvertAll(cf => cf.ToResource(true)));
return Ok(customFormats.ConvertAll(cf => cf.ToResource(true)));
}
[RestDeleteById]
public void DeleteFormat(int id)
public ActionResult DeleteFormat(int id)
{
_formatService.Delete(id);
return NoContent();
}
[HttpDelete("bulk")]
[Consumes("application/json")]
public virtual object DeleteFormats([FromBody] CustomFormatBulkResource resource)
public virtual ActionResult DeleteFormats([FromBody] CustomFormatBulkResource resource)
{
_formatService.Delete(resource.Ids.ToList());
return new { };
return NoContent();
}
[HttpGet("schema")]

View file

@ -101,8 +101,9 @@ public ActionResult<MovieFileResource> SetMovieFile([FromBody] MovieFileResource
movieFile.SceneName = movieFileResource.SceneName;
}
_mediaFileService.Update(movieFile);
return Accepted(movieFile.Id);
var updatedFile = _mediaFileService.Update(movieFile);
var movie = _movieService.GetMovie(updatedFile.MovieId);
return Ok(updatedFile.ToResource(movie, _upgradableSpecification, _formatCalculator));
}
[Obsolete("Use bulk endpoint instead")]
@ -155,11 +156,11 @@ public object SetMovieFile([FromBody] MovieFileListResource resource)
var movie = _movieService.GetMovie(movieFiles.First().MovieId);
return Accepted(movieFiles.ConvertAll(f => f.ToResource(movie, _upgradableSpecification, _formatCalculator)));
return Ok(movieFiles.ConvertAll(f => f.ToResource(movie, _upgradableSpecification, _formatCalculator)));
}
[RestDeleteById]
public void DeleteMovieFile(int id)
public ActionResult DeleteMovieFile(int id)
{
var movieFile = _mediaFileService.GetMovie(id);
@ -171,11 +172,13 @@ public void DeleteMovieFile(int id)
var movie = _movieService.GetMovie(movieFile.MovieId);
_mediaFileDeletionService.DeleteMovieFile(movie, movieFile);
return NoContent();
}
[HttpDelete("bulk")]
[Consumes("application/json")]
public object DeleteMovieFiles([FromBody] MovieFileListResource resource)
public ActionResult DeleteMovieFiles([FromBody] MovieFileListResource resource)
{
if (!resource.MovieFileIds.Any())
{
@ -186,7 +189,7 @@ public object DeleteMovieFiles([FromBody] MovieFileListResource resource)
if (movieFiles.Count == 0)
{
return new { };
return NoContent();
}
var movie = _movieService.GetMovie(movieFiles.First().MovieId);
@ -196,7 +199,7 @@ public object DeleteMovieFiles([FromBody] MovieFileListResource resource)
_mediaFileDeletionService.DeleteMovieFile(movie, movieFile);
}
return new { };
return NoContent();
}
[HttpPut("bulk")]

View file

@ -271,15 +271,18 @@ public ActionResult<MovieResource> UpdateMovie([FromBody] MovieResource moviesRe
var updatedMovie = _moviesService.UpdateMovie(model);
BroadcastResourceChange(ModelAction.Updated, MapToResource(updatedMovie));
var resource = MapToResource(updatedMovie);
return Ok(moviesResource);
BroadcastResourceChange(ModelAction.Updated, resource);
return Ok(resource);
}
[RestDeleteById]
public void DeleteMovie(int id, bool deleteFiles = false, bool addImportExclusion = false)
public ActionResult DeleteMovie(int id, bool deleteFiles = false, bool addImportExclusion = false)
{
_moviesService.DeleteMovie(id, deleteFiles, addImportExclusion);
return NoContent();
}
private void MapCoversToLocal(MovieResource movie)

View file

@ -132,7 +132,7 @@ public IActionResult SaveAll([FromBody] MovieEditorResource resource)
moviesResources.Add(movieResource);
}
return Accepted(moviesResources);
return Ok(moviesResources);
}
[HttpDelete]

View file

@ -118,10 +118,10 @@ public ActionResult<TProviderResource> UpdateProvider([FromRoute] int id, [FromB
if (hasDefinitionChanged)
{
_providerFactory.Update(providerDefinition);
providerDefinition = _providerFactory.Update(providerDefinition);
}
return Accepted(existingDefinition.Id);
return Ok(_resourceMapper.ToResource(providerDefinition));
}
[HttpPut("bulk")]
@ -162,7 +162,7 @@ public virtual ActionResult<TProviderResource> UpdateProvider([FromBody] TBulkPr
_bulkResourceMapper.UpdateModel(providerResource, definitionsToUpdate);
return Accepted(_providerFactory.Update(definitionsToUpdate).Select(x => _resourceMapper.ToResource(x)));
return Ok(_providerFactory.Update(definitionsToUpdate).Select(x => _resourceMapper.ToResource(x)));
}
private TProviderDefinition GetDefinition(TProviderResource providerResource, TProviderDefinition existingDefinition, bool validate, bool includeWarnings, bool forceValidate)

View file

@ -71,7 +71,7 @@ protected override QueueResource GetResourceById(int id)
}
[RestDeleteById]
public void RemoveAction(int id, bool removeFromClient = true, bool blocklist = false, bool skipRedownload = false, bool changeCategory = false)
public ActionResult RemoveAction(int id, bool removeFromClient = true, bool blocklist = false, bool skipRedownload = false, bool changeCategory = false)
{
var pendingRelease = _pendingReleaseService.FindPendingQueueItem(id);
@ -79,7 +79,7 @@ public void RemoveAction(int id, bool removeFromClient = true, bool blocklist =
{
Remove(pendingRelease, blocklist);
return;
return NoContent();
}
var trackedDownload = GetTrackedDownload(id);
@ -91,10 +91,12 @@ public void RemoveAction(int id, bool removeFromClient = true, bool blocklist =
Remove(trackedDownload, removeFromClient, blocklist, skipRedownload, changeCategory);
_trackedDownloadService.StopTracking(trackedDownload.DownloadItem.DownloadId);
return NoContent();
}
[HttpDelete("bulk")]
public object RemoveMany([FromBody] QueueBulkResource resource, [FromQuery] bool removeFromClient = true, [FromQuery] bool blocklist = false, [FromQuery] bool skipRedownload = false, [FromQuery] bool changeCategory = false)
public ActionResult RemoveMany([FromBody] QueueBulkResource resource, [FromQuery] bool removeFromClient = true, [FromQuery] bool blocklist = false, [FromQuery] bool skipRedownload = false, [FromQuery] bool changeCategory = false)
{
var trackedDownloadIds = new List<string>();
var pendingToRemove = new List<NzbDrone.Core.Queue.Queue>();
@ -131,7 +133,7 @@ public object RemoveMany([FromBody] QueueBulkResource resource, [FromQuery] bool
_trackedDownloadService.StopTracking(trackedDownloadIds);
return new { };
return NoContent();
}
[HttpGet]

View file

@ -67,9 +67,10 @@ public List<RemotePathMappingResource> GetMappings()
}
[RestDeleteById]
public void DeleteMapping(int id)
public ActionResult DeleteMapping(int id)
{
_remotePathMappingService.Remove(id);
return NoContent();
}
[RestPutById]
@ -77,7 +78,9 @@ public ActionResult<RemotePathMappingResource> UpdateMapping([FromBody] RemotePa
{
var mapping = resource.ToModel();
return Accepted(_remotePathMappingService.Update(mapping));
var updated = _remotePathMappingService.Update(mapping);
return Ok(updated.ToResource());
}
}
}

View file

@ -64,9 +64,10 @@ public List<RootFolderResource> GetRootFolders()
}
[RestDeleteById]
public void DeleteFolder(int id)
public ActionResult DeleteFolder(int id)
{
_rootFolderService.Remove(id);
return NoContent();
}
}
}

View file

@ -54,14 +54,15 @@ public ActionResult<TagResource> Create([FromBody] TagResource resource)
[Consumes("application/json")]
public ActionResult<TagResource> Update([FromBody] TagResource resource)
{
_tagService.Update(resource.ToModel());
return Accepted(resource.Id);
var updatedTag = _tagService.Update(resource.ToModel());
return Ok(updatedTag.ToResource());
}
[RestDeleteById]
public void DeleteTag(int id)
public ActionResult DeleteTag(int id)
{
_tagService.Delete(id);
return NoContent();
}
[NonAction]