본문 바로가기
Storify

STORIFY (0119) - API 구조 변경

by Peter.JH 2024. 1. 19.
728x90

0. book.schema 수정하여 DB에 저장되고 read하기 편하게 수정

  @Prop({
    type: Map,
    of: {
      text: String,
      imagePrompt: [String],
      imageUrl: String,
      ttsUrl: String,
    },
  })
  body: Map<
    string,
    {
      text: string;
      imagePrompt: string[];
      imageUrl: string;
      ttsUrl: string;
    }
  >;

 

 

1. stories에 api추가 

현재: stories에 Post 요청시 일기 저장, 동화 생성, 동화 저장이 다 되고있었음

수정 후:

-  stories/ai Post 요청시 일기 저장, 동화 생성, 동화 저장 수행

-  stories에 Post 요청시 일기만 저장

 

2. createAiStory 수정

현재: stories/ai Post 요청시 story기반으로 생성된 book(동화)가 어떤 story기반으로 만들어진건지 저장이 안되고 있음.

수정 후: createAiStory 수행시 newStory로 일기 저장 후 await로 기다리고 이후 생성된 story 의 고유 id(objectid)를 같이 저장하여 생성될 book이 어느 story기반인지 알게 함.

 

3. 유효한 토큰을 가지고 있는 유저만 동화 생성이 가능하도록 수정

어디서 수행하는게 좋을까? controller, service.....

유효성 검사 로직은 비즈니스 로직의 일부로 볼 수 있고, 이는 서비스 레이어에서 처리하는 것이 적절하다. 컨트롤러는 요청 처리와 응답 반환, 그리고 필요한 정보를 서비스 레이어에 전달하는 역할만 하게 되고, 실제 비즈니스 로직은 서비스 레이어에서 처리하게 되어 코드의 역할이 명확해 진다. 

하지만 나는 jwt토큰을 사용해서

@UseGuards(AccessTokenGuard)
  @ApiBearerAuth()

 

이렇게 controller에서 처리하기에 service가 아닌 controller에서 처리하면 된다. 

이건 유효성 검사이다.

내가 필요한건 유저 정보이다. 토큰을 통해 이걸 어떻게 확인할까?

  @UseGuards(AccessTokenGuard)
  @ApiBearerAuth()
  @ApiOperation({ summary: 'AI 동화책 생성을 위한 endpoint' })
  @Post('ai')
  createAiStory(
    @Req() req: any,
    @Body() createStoryDto: CreateStoryDto,
  ): Promise<Story> {
    const userId = req.user['sub'];
    createStoryDto.userId = userId;
    return this.storiesService.createAiStory(createStoryDto);
  }

req를 통해들어온 user에서 sub정보안에 유저의 id값이 있다!

 

 

정리

 

1. API 구조 변경: - 'stories/ai' 엔드포인트에 POST 요청을 보내면, 일기 저장, 동화 생성, 동화 저장의 모든 과정이 수행되는 기존의 구조에서, 일기 저장만 수행하는 'stories' 엔드포인트를 추가하였습니다. 'stories/ai' 엔드포인트는 여전히 일기 저장, 동화 생성, 동화 저장을 수행합니다.

 

2. 동화 생성 함수 수정: - 'createAiStory' 함수를 수정하여, 동화가 어떤 일기를 기반으로 생성되었는지를 알 수 있게 하였습니다. 이를 위해, 새로운 일기를 저장하고 나서 해당 일기의 고유 ID를 동화와 함께 저장하도록 하였습니다.

 

3. 사용자 인증 추가: - 동화 생성 기능을 사용할 수 있는 사용자를 인증 토큰을 가진 사용자로 제한하였습니다. 이를 위해, 'AccessTokenGuard'와 'ApiBearerAuth'를 사용하여 컨트롤러에서 사용자 인증을 수행하도록 하였습니다.

 

 

todo: 

1. ai모듈에 있는 createStoryBook을 books모듈로 이식

2, book모듈내 updateBook 추가

 

728x90