@@ -22,9 +22,11 @@ public BoardsAdminController(RepoServerContext db)
2222 _db = db ;
2323 }
2424
25- [ HttpPut ( "{boardId}" ) ]
26- public async Task < IActionResult > UpsertBoard (
27- [ FromRoute ] string boardId ,
25+ /// <summary>
26+ /// Create a new board. <c>Name</c> is the unique identifier visible to clients.
27+ /// </summary>
28+ [ HttpPost ]
29+ public async Task < IActionResult > CreateBoard (
2830 [ FromBody ] CreateFirmwareBoardRequest request ,
2931 CancellationToken ct )
3032 {
@@ -33,46 +35,58 @@ public async Task<IActionResult> UpsertBoard(
3335 return Problem ( FirmwareError . FirmwareChipNotFound ) ;
3436 }
3537
36- var requiredArtifactTypes = Array . Empty < FirmwareArtifactType > ( ) ;
37- if ( request . RequiredArtifactTypes is { Count : > 0 } )
38+ if ( ! TryParseRequiredArtifactTypes ( request . RequiredArtifactTypes , out var requiredArtifactTypes ) )
3839 {
39- var parsed = new List < FirmwareArtifactType > ( ) ;
40- foreach ( var typeStr in request . RequiredArtifactTypes )
41- {
42- if ( ! Enum . TryParse < FirmwareArtifactType > ( typeStr , true , out var artifactType ) )
43- {
44- return Problem ( FirmwareError . FirmwareInvalidArtifactType ) ;
45- }
46- parsed . Add ( artifactType ) ;
47- }
48- requiredArtifactTypes = parsed . Distinct ( ) . ToArray ( ) ;
40+ return Problem ( FirmwareError . FirmwareInvalidArtifactType ) ;
4941 }
5042
51- var existing = await _db . FirmwareBoards . FirstOrDefaultAsync ( b => b . Id == boardId , ct ) ;
52- if ( existing is not null )
43+ var board = new FirmwareBoard
5344 {
54- existing . Name = request . Name ;
55- existing . ChipId = request . ChipId ;
56- existing . RequiredArtifactTypes = requiredArtifactTypes ;
45+ Id = Guid . NewGuid ( ) ,
46+ Name = request . Name ,
47+ ChipId = request . ChipId ,
48+ Discontinued = false ,
49+ RequiredArtifactTypes = requiredArtifactTypes
50+ } ;
51+
52+ _db . FirmwareBoards . Add ( board ) ;
53+ await _db . SaveChangesAsync ( ct ) ;
54+
55+ return Created ( ( string ? ) null , new { id = board . Id } ) ;
56+ }
57+
58+ [ HttpPut ( "{boardId:guid}" ) ]
59+ public async Task < IActionResult > UpdateBoard (
60+ [ FromRoute ] Guid boardId ,
61+ [ FromBody ] CreateFirmwareBoardRequest request ,
62+ CancellationToken ct )
63+ {
64+ if ( ! await _db . FirmwareChips . AnyAsync ( c => c . Id == request . ChipId , ct ) )
65+ {
66+ return Problem ( FirmwareError . FirmwareChipNotFound ) ;
5767 }
58- else
68+
69+ if ( ! TryParseRequiredArtifactTypes ( request . RequiredArtifactTypes , out var requiredArtifactTypes ) )
5970 {
60- _db . FirmwareBoards . Add ( new FirmwareBoard
61- {
62- Id = boardId ,
63- Name = request . Name ,
64- ChipId = request . ChipId ,
65- Discontinued = false ,
66- RequiredArtifactTypes = requiredArtifactTypes
67- } ) ;
71+ return Problem ( FirmwareError . FirmwareInvalidArtifactType ) ;
72+ }
73+
74+ var board = await _db . FirmwareBoards . FirstOrDefaultAsync ( b => b . Id == boardId , ct ) ;
75+ if ( board is null )
76+ {
77+ return Problem ( FirmwareError . FirmwareBoardNotFound ) ;
6878 }
6979
80+ board . Name = request . Name ;
81+ board . ChipId = request . ChipId ;
82+ board . RequiredArtifactTypes = requiredArtifactTypes ;
83+
7084 await _db . SaveChangesAsync ( ct ) ;
71- return Created ( ) ;
85+ return Ok ( ) ;
7286 }
7387
74- [ HttpPatch ( "{boardId}/discontinue" ) ]
75- public async Task < IActionResult > DiscontinueBoard ( [ FromRoute ] string boardId , CancellationToken ct )
88+ [ HttpPatch ( "{boardId:guid }/discontinue" ) ]
89+ public async Task < IActionResult > DiscontinueBoard ( [ FromRoute ] Guid boardId , CancellationToken ct )
7690 {
7791 var board = await _db . FirmwareBoards . FirstOrDefaultAsync ( b => b . Id == boardId , ct ) ;
7892 if ( board is null )
@@ -85,8 +99,8 @@ public async Task<IActionResult> DiscontinueBoard([FromRoute] string boardId, Ca
8599 return Ok ( ) ;
86100 }
87101
88- [ HttpDelete ( "{boardId}" ) ]
89- public async Task < IActionResult > DeleteBoard ( [ FromRoute ] string boardId , CancellationToken ct )
102+ [ HttpDelete ( "{boardId:guid }" ) ]
103+ public async Task < IActionResult > DeleteBoard ( [ FromRoute ] Guid boardId , CancellationToken ct )
90104 {
91105 if ( await _db . FirmwareArtifacts . AnyAsync ( a => a . BoardId == boardId , ct ) )
92106 {
@@ -102,9 +116,9 @@ public async Task<IActionResult> DeleteBoard([FromRoute] string boardId, Cancell
102116 return NoContent ( ) ;
103117 }
104118
105- [ HttpPut ( "{boardId}/usb-devices/{usbDeviceId:guid}" ) ]
119+ [ HttpPut ( "{boardId:guid }/usb-devices/{usbDeviceId:guid}" ) ]
106120 public async Task < IActionResult > AttachUsbDevice (
107- [ FromRoute ] string boardId ,
121+ [ FromRoute ] Guid boardId ,
108122 [ FromRoute ] Guid usbDeviceId ,
109123 CancellationToken ct )
110124 {
@@ -133,9 +147,9 @@ public async Task<IActionResult> AttachUsbDevice(
133147 return NoContent ( ) ;
134148 }
135149
136- [ HttpDelete ( "{boardId}/usb-devices/{usbDeviceId:guid}" ) ]
150+ [ HttpDelete ( "{boardId:guid }/usb-devices/{usbDeviceId:guid}" ) ]
137151 public async Task < IActionResult > DetachUsbDevice (
138- [ FromRoute ] string boardId ,
152+ [ FromRoute ] Guid boardId ,
139153 [ FromRoute ] Guid usbDeviceId ,
140154 CancellationToken ct )
141155 {
@@ -145,4 +159,27 @@ await _db.FirmwareBoardUsbDevices
145159
146160 return NoContent ( ) ;
147161 }
162+
163+ private static bool TryParseRequiredArtifactTypes ( List < string > ? raw , out FirmwareArtifactType [ ] parsed )
164+ {
165+ if ( raw is null || raw . Count == 0 )
166+ {
167+ parsed = Array . Empty < FirmwareArtifactType > ( ) ;
168+ return true ;
169+ }
170+
171+ var list = new List < FirmwareArtifactType > ( raw . Count ) ;
172+ foreach ( var typeStr in raw )
173+ {
174+ if ( ! Enum . TryParse < FirmwareArtifactType > ( typeStr , true , out var t ) )
175+ {
176+ parsed = Array . Empty < FirmwareArtifactType > ( ) ;
177+ return false ;
178+ }
179+ list . Add ( t ) ;
180+ }
181+
182+ parsed = list . Distinct ( ) . ToArray ( ) ;
183+ return true ;
184+ }
148185}
0 commit comments