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' ;
219
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 ;
1223
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+ }
2427
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 ;
2836 }
2937
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 );
3546 }
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 ;
3949 }
40- @ GetMapping (value = "/{id}" )
41- public ResponseEntity <MediaItemResponse > getItemById (@ PathVariable ("id" ) UUID id ) {
4250
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+ }
4465
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+ }
5077}
51- }
0 commit comments