1
- package com .codedifferently .lesson26 .web ;
1
+ import {
2
+ Body ,
3
+ Controller ,
4
+ Delete ,
5
+ Get ,
6
+ HttpCode ,
7
+ HttpStatus ,
8
+ Param ,
9
+ Post ,
10
+ Res ,
11
+ } from '@nestjs/common' ;
12
+ import { Response } from 'express' ;
13
+ import { Librarian , LibraryService , MediaItem } from '../library' ;
14
+ import { CreateMediaItemRequest } from './create_media_item_request' ;
15
+ import { CreateMediaItemResponse } from './create_media_item_response' ;
16
+ import { GetMediaItemsResponse } from './get_media_items_response' ;
17
+ import { fromMediaItemRequest } from './media_item_request' ;
18
+ import { MediaItemResponse , toMediaItemResponse } from './media_item_response' ;
2
19
3
- import com .codedifferently .lesson26 .library .Librarian ;
4
- import com .codedifferently .lesson26 .library .Library ;
5
- import com .codedifferently .lesson26 .library .MediaItem ;
6
- import com .codedifferently .lesson26 .library .search .SearchCriteria ;
7
- import java .io .IOException ;
8
- import java .util .List ;
9
- import java .util .Optional ;
10
- import java .util .Set ;
11
- import java .util .UUID ;
20
+ @ Controller ()
21
+ export class MediaItemsController {
22
+ private readonly librarian : Librarian ;
12
23
13
- import org .springframework .http .ResponseEntity ;
14
- import org .springframework .web .bind .annotation .CrossOrigin ;
15
- import org .springframework .web .bind .annotation .GetMapping ;
16
- import org .springframework .web .bind .annotation .RestController ;
17
-
18
- @ RestController
19
- @ CrossOrigin
20
- public class MediaItemsController {
21
-
22
- private final Library library ;
23
- private final Librarian librarian ;
24
+ constructor (private readonly library : LibraryService ) {
25
+ this .librarian = library .getLibrarians ()[0 ];
26
+ }
24
27
25
- public MediaItemsController (Library library ) throws IOException {
26
- this .library = library ;
27
- this .librarian = library .getLibrarians ().stream ().findFirst ().orElseThrow ();
28
+ @ Get ('items' )
29
+ getItems (): GetMediaItemsResponse {
30
+ const items : ReadonlySet <MediaItem > = this .library .search ({});
31
+ const responseItems : MediaItemResponse [] = [...items ].map (
32
+ toMediaItemResponse ,
33
+ );
34
+ const response = { items : responseItems };
35
+ return response ;
28
36
}
29
37
30
- @ GetMapping ("/items" )
31
- public ResponseEntity <GetMediaItemsResponse > getItems () {
32
- Set <MediaItem > items = library .search (SearchCriteria .builder ().build ());
33
- if (items .isEmpty ()) {
34
- ResponseEntity .noContent ();
38
+ @ Get ('items/:id' )
39
+ getItem (
40
+ @ Param ('id' ) id : string ,
41
+ @ Res ({ passthrough : true }) res : Response ,
42
+ ): MediaItemResponse {
43
+ const items = this .library .search ({ id });
44
+ if (items .size === 0 ) {
45
+ res .status (HttpStatus .NOT_FOUND );
35
46
}
36
- List <MediaItemResponse > responseItems = items .stream ().map (MediaItemResponse ::from ).toList ();
37
- var response = GetMediaItemsResponse .builder ().items (responseItems ).build ();
38
- return ResponseEntity .ok (response );
47
+ const item = items .values ().next ().value ;
48
+ return item ? toMediaItemResponse (item ) : undefined ;
39
49
}
40
- @ GetMapping (value = "/{id}" )
41
- public ResponseEntity <MediaItemResponse > getItemById (@ PathVariable ("id" ) UUID id ) {
42
50
43
- System .out .println (id .toString ());
51
+ @ Post ('items' )
52
+ @ HttpCode (HttpStatus .OK )
53
+ addItem (
54
+ @ Body () body : CreateMediaItemRequest ,
55
+ @ Res ({ passthrough : true }) res : Response ,
56
+ ): CreateMediaItemResponse {
57
+ if (!body .item ) {
58
+ res .status (HttpStatus .BAD_REQUEST );
59
+ return { errors : ['Missing item' ] };
60
+ }
61
+ const item = fromMediaItemRequest (body .item );
62
+ this .library .addMediaItem (item , this .librarian );
63
+ return { item : toMediaItemResponse (item ) };
64
+ }
44
65
45
- Set <MediaItem > items = library .search (SearchCriteria .builder ().id (id .toString ()).build ());
46
- Optional <MediaItem > matchedItem =
47
- items .stream ().filter (item -> item .getId ().equals (id )).findFirst ();
48
- System .out .println ("items" );
49
- return null ;
66
+ @ Delete ('items/:id' )
67
+ @ HttpCode (HttpStatus .NO_CONTENT )
68
+ deleteItem (
69
+ @ Param ('id' ) id : string ,
70
+ @ Res ({ passthrough : true }) res : Response ,
71
+ ): void {
72
+ if (!this .library .hasMediaItemById (id )) {
73
+ res .status (HttpStatus .NOT_FOUND );
74
+ }
75
+ this .library .removeMediaItemById (id , this .librarian );
76
+ }
50
77
}
51
- }
0 commit comments