-
-
Notifications
You must be signed in to change notification settings - Fork 158
/
Copy pathTodoItemsCustomController.cs
146 lines (121 loc) · 4.86 KB
/
TodoItemsCustomController.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
using System.Collections.Generic;
using System.Threading.Tasks;
using JsonApiDotNetCore.Controllers;
using JsonApiDotNetCore.Models;
using JsonApiDotNetCore.Services;
using JsonApiDotNetCoreExample.Models;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
namespace JsonApiDotNetCoreExample.Controllers
{
[DisableRoutingConvention]
[Route("custom/route/todo-items")]
public class TodoItemsCustomController : CustomJsonApiController<TodoItem>
{
public TodoItemsCustomController(
IJsonApiContext jsonApiContext,
IResourceService<TodoItem> resourceService,
ILoggerFactory loggerFactory)
: base(jsonApiContext, resourceService, loggerFactory)
{ }
}
public class CustomJsonApiController<T>
: CustomJsonApiController<T, int> where T : class, IIdentifiable<int>
{
public CustomJsonApiController(
IJsonApiContext jsonApiContext,
IResourceService<T, int> resourceService,
ILoggerFactory loggerFactory)
: base(jsonApiContext, resourceService, loggerFactory)
{ }
}
public class CustomJsonApiController<T, TId>
: ControllerBase where T : class, IIdentifiable<TId>
{
private readonly ILogger _logger;
private readonly IResourceService<T, TId> _resourceService;
private readonly IJsonApiContext _jsonApiContext;
protected IActionResult Forbidden()
{
return new StatusCodeResult(403);
}
public CustomJsonApiController(
IJsonApiContext jsonApiContext,
IResourceService<T, TId> resourceService,
ILoggerFactory loggerFactory)
{
_jsonApiContext = jsonApiContext.ApplyContext<T>(this);
_resourceService = resourceService;
_logger = loggerFactory.CreateLogger<JsonApiDotNetCore.Controllers.JsonApiController<T, TId>>();
}
public CustomJsonApiController(
IJsonApiContext jsonApiContext,
IResourceService<T, TId> resourceService)
{
_jsonApiContext = jsonApiContext.ApplyContext<T>(this);
_resourceService = resourceService;
}
[HttpGet]
public virtual async Task<IActionResult> GetAsync()
{
var entities = await _resourceService.GetAsync();
return Ok(entities);
}
[HttpGet("{id}")]
public virtual async Task<IActionResult> GetAsync(TId id)
{
var entity = await _resourceService.GetAsync(id);
if (entity == null)
return NotFound();
return Ok(entity);
}
[HttpGet("{id}/relationships/{relationshipName}")]
public virtual async Task<IActionResult> GetRelationshipsAsync(TId id, string relationshipName)
{
var relationship = _resourceService.GetRelationshipAsync(id, relationshipName);
if (relationship == null)
return NotFound();
return await GetRelationshipAsync(id, relationshipName);
}
[HttpGet("{id}/{relationshipName}")]
public virtual async Task<IActionResult> GetRelationshipAsync(TId id, string relationshipName)
{
var relationship = await _resourceService.GetRelationshipAsync(id, relationshipName);
return Ok(relationship);
}
[HttpPost]
public virtual async Task<IActionResult> PostAsync([FromBody] T entity)
{
if (entity == null)
return UnprocessableEntity();
if (!_jsonApiContext.Options.AllowClientGeneratedIds && !string.IsNullOrEmpty(entity.StringId))
return Forbidden();
entity = await _resourceService.CreateAsync(entity);
return Created($"{HttpContext.Request.Path}/{entity.Id}", entity);
}
[HttpPatch("{id}")]
public virtual async Task<IActionResult> PatchAsync(TId id, [FromBody] T entity)
{
if (entity == null)
return UnprocessableEntity();
var updatedEntity = await _resourceService.UpdateAsync(id, entity);
if (updatedEntity == null)
return NotFound();
return Ok(updatedEntity);
}
[HttpPatch("{id}/relationships/{relationshipName}")]
public virtual async Task<IActionResult> PatchRelationshipsAsync(TId id, string relationshipName, [FromBody] List<DocumentData> relationships)
{
await _resourceService.UpdateRelationshipsAsync(id, relationshipName, relationships);
return Ok();
}
[HttpDelete("{id}")]
public virtual async Task<IActionResult> DeleteAsync(TId id)
{
var wasDeleted = await _resourceService.DeleteAsync(id);
if (!wasDeleted)
return NotFound();
return NoContent();
}
}
}