@@ -13,21 +13,15 @@ namespace BackendFramework.Controllers
1313 [ Authorize ]
1414 [ Produces ( "application/json" ) ]
1515 [ Route ( "v1/projects/{projectId}/words" ) ]
16- public class WordController : Controller
16+ public class WordController (
17+ IWordRepository wordRepo , IWordService wordService , IPermissionService permissionService ) : Controller
1718 {
18- private readonly IWordRepository _wordRepo ;
19- private readonly IPermissionService _permissionService ;
20- private readonly IWordService _wordService ;
19+ private readonly IWordRepository _wordRepo = wordRepo ;
20+ private readonly IPermissionService _permissionService = permissionService ;
21+ private readonly IWordService _wordService = wordService ;
2122
2223 private const string otelTagName = "otel.WordController" ;
2324
24- public WordController ( IWordRepository repo , IWordService wordService , IPermissionService permissionService )
25- {
26- _wordRepo = repo ;
27- _permissionService = permissionService ;
28- _wordService = wordService ;
29- }
30-
3125 /// <summary> Deletes specified Frontier <see cref="Word"/>. </summary>
3226 [ HttpDelete ( "frontier/{wordId}" , Name = "DeleteFrontierWord" ) ]
3327 [ ProducesResponseType ( StatusCodes . Status200OK ) ]
@@ -43,8 +37,8 @@ public async Task<IActionResult> DeleteFrontierWord(string projectId, string wor
4337 }
4438 var userId = _permissionService . GetUserId ( HttpContext ) ;
4539
46- var deletedWordId = await _wordService . DeleteFrontierWord ( projectId , userId , wordId ) ;
47- return deletedWordId is null ? NotFound ( ) : Ok ( ) ;
40+ var deleted = await _wordService . DeleteFrontierWord ( projectId , userId , wordId ) ;
41+ return deleted is null ? NotFound ( ) : Ok ( ) ;
4842 }
4943
5044 /// <summary> Returns <see cref="Word"/> with specified id. </summary>
@@ -60,12 +54,9 @@ public async Task<IActionResult> GetWord(string projectId, string wordId)
6054 {
6155 return Forbid ( ) ;
6256 }
63- var word = await _wordRepo . GetWord ( projectId , wordId ) ;
64- if ( word is null )
65- {
66- return NotFound ( ) ;
67- }
68- return Ok ( word ) ;
57+
58+ Word ? word = await _wordRepo . GetWord ( projectId , wordId ) ;
59+ return word is null ? NotFound ( ) : Ok ( word ) ;
6960 }
7061
7162 /// <summary> Checks if Frontier for specified <see cref="Project"/> has any words. </summary>
@@ -80,6 +71,7 @@ public async Task<IActionResult> HasFrontierWords(string projectId)
8071 {
8172 return Forbid ( ) ;
8273 }
74+
8375 return Ok ( await _wordRepo . HasFrontierWords ( projectId ) ) ;
8476 }
8577
@@ -95,6 +87,7 @@ public async Task<IActionResult> GetFrontierCount(string projectId)
9587 {
9688 return Forbid ( ) ;
9789 }
90+
9891 return Ok ( await _wordRepo . GetFrontierCount ( projectId ) ) ;
9992 }
10093
@@ -110,6 +103,7 @@ public async Task<IActionResult> GetProjectFrontierWords(string projectId)
110103 {
111104 return Forbid ( ) ;
112105 }
106+
113107 return Ok ( await _wordRepo . GetFrontier ( projectId ) ) ;
114108 }
115109
@@ -125,6 +119,7 @@ public async Task<IActionResult> IsInFrontier(string projectId, string wordId)
125119 {
126120 return Forbid ( ) ;
127121 }
122+
128123 return Ok ( await _wordRepo . IsInFrontier ( projectId , wordId ) ) ;
129124 }
130125
@@ -170,7 +165,8 @@ public async Task<IActionResult> GetDuplicateId(string projectId, [FromBody, Bin
170165 }
171166 word . ProjectId = projectId ;
172167
173- return Ok ( await _wordService . FindContainingWord ( word ) ?? "" ) ;
168+ string ? containingId = await _wordService . FindContainingWord ( word ) ;
169+ return Ok ( containingId ?? "" ) ;
174170 }
175171
176172 /// <summary> Combines a <see cref="Word"/> into the existing duplicate with specified wordId. </summary>
@@ -203,9 +199,8 @@ public async Task<IActionResult> UpdateDuplicate(
203199 return Conflict ( ) ;
204200 }
205201
206- await _wordService . Update ( duplicatedWord . ProjectId , userId , duplicatedWord . Id , duplicatedWord ) ;
207-
208- return Ok ( duplicatedWord . Id ) ;
202+ string ? newId = ( await _wordService . Update ( userId , duplicatedWord ) ) ? . Id ;
203+ return newId is null ? NotFound ( ) : Ok ( newId ) ;
209204 }
210205
211206 /// <summary> Creates a <see cref="Word"/>. </summary>
@@ -221,9 +216,11 @@ public async Task<IActionResult> CreateWord(string projectId, [FromBody, BindReq
221216 {
222217 return Forbid ( ) ;
223218 }
219+
224220 word . ProjectId = projectId ;
225- var userId = _permissionService . GetUserId ( HttpContext ) ;
226- return Ok ( ( await _wordService . Create ( userId , word ) ) . Id ) ;
221+
222+ string newId = ( await _wordService . Create ( _permissionService . GetUserId ( HttpContext ) , word ) ) . Id ;
223+ return Ok ( newId ) ;
227224 }
228225
229226 /// <summary> Updates a <see cref="Word"/>. </summary>
@@ -241,17 +238,13 @@ public async Task<IActionResult> UpdateWord(
241238 {
242239 return Forbid ( ) ;
243240 }
244- var document = await _wordRepo . GetWord ( projectId , wordId ) ;
245- if ( document is null )
246- {
247- return NotFound ( ) ;
248- }
249241
250- // Add the found id to the updated word.
251- word . Id = document . Id ;
252- var userId = _permissionService . GetUserId ( HttpContext ) ;
253- await _wordService . Update ( projectId , userId , wordId , word ) ;
254- return Ok ( word . Id ) ;
242+ // Don't allow changing project or manually setting the Id.
243+ word . ProjectId = projectId ;
244+ word . Id = wordId ;
245+
246+ string ? newId = ( await _wordService . Update ( _permissionService . GetUserId ( HttpContext ) , word ) ) ? . Id ;
247+ return newId is null ? NotFound ( ) : Ok ( newId ) ;
255248 }
256249
257250 /// <summary> Restore a deleted <see cref="Word"/>. </summary>
@@ -276,7 +269,7 @@ public async Task<IActionResult> RestoreWord(string projectId, string wordId)
276269 return Ok ( await _wordService . RestoreFrontierWords ( projectId , [ wordId ] ) ) ;
277270 }
278271
279- /// <summary> Revert words from an dictionary of word ids (key: to revert to; value: from frontier). </summary>
272+ /// <summary> Revert words from a dictionary of word ids (key: to revert to; value: from frontier). </summary>
280273 /// <returns> Id dictionary of all words successfully updated (key: was in frontier; value: new id). </returns>
281274 [ HttpPost ( "revertwords" , Name = "RevertWords" ) ]
282275 [ ProducesResponseType ( StatusCodes . Status200OK , Type = typeof ( Dictionary < string , string > ) ) ]
@@ -296,11 +289,15 @@ public async Task<IActionResult> RevertWords(
296289 foreach ( var kv in wordIds )
297290 {
298291 var idToRevert = kv . Value ;
299- var word = await _wordRepo . GetWord ( projectId , kv . Key ) ;
300- if ( word is not null && await _wordRepo . IsInFrontier ( projectId , idToRevert ) )
292+ var priorWord = await _wordRepo . GetWord ( projectId , kv . Key ) ;
293+ if ( priorWord is not null )
301294 {
302- await _wordService . Update ( projectId , userId , idToRevert , word ) ;
303- updates [ idToRevert ] = word . Id ;
295+ priorWord . Id = idToRevert ;
296+ var newId = ( await _wordService . Update ( userId , priorWord ) ) ? . Id ;
297+ if ( newId is not null )
298+ {
299+ updates [ idToRevert ] = newId ;
300+ }
304301 }
305302 }
306303 return Ok ( updates ) ;
0 commit comments