import { Body, Controller, Delete, Get, NotFoundException, Param, Post, Put } from '@nestjs/common';
import { PostsService } from './posts.service';
@Controller('posts')
export class PostsController {
constructor(private readonly postsService: PostsService) {}
@Get()
getPosts() {
return this.postsService.getAllPosts();
}
@Get(':id')
getPost(@Param('id') id: string) { // url의 id 부분만 가져오고 변수 id에 넣는다.
return this.postsService.getPostById(+id); // +를 붙이면 string -> number
}
@Post()
postPosts(
@Body('author') author: string,
@Body('title') title: string,
@Body('content') content: string,
) {
return this.postsService.createPost(
author, title, content
);
}
@Put(':id')
putPost(
// ?가 들어가면 있을수도 있고 없을수도 있다.
@Param('id') id: string,
@Body('author') author?: string,
@Body('title') title?: string,
@Body('content') content?: string,
) {
return this.postsService.updatePost(+id, author, title, content);
}
@Delete(':id')
deletePost(@Param('id') id: string) {
return this.postsService.deletePost(+id);
}
}
import { Injectable, NotFoundException } from '@nestjs/common';
/**
* author: string
* title: string
* content: string
* likeCount: number
* commentCount: number
*/
export interface PostModel {
id: number;
author: string;
title: string;
content: string;
likeCount: number;
commentCount: number;
}
let posts: PostModel[] = [
{
id: 1,
author: 'newjeans_minji',
title: '뉴진스 민지',
content: '메이크업 고치고 있는 민지',
likeCount: 100000,
commentCount: 999,
},
{
id: 2,
author: 'newjeans_herin',
title: '뉴진스 헤린',
content: '춤추고 있는 헤린',
likeCount: 100000,
commentCount: 999,
},
{
id: 3,
author: 'newjeans_daniel',
title: '뉴진스 다니엘',
content: '노래부르는 다니엘',
likeCount: 100000,
commentCount: 999,
},
]
@Injectable()
export class PostsService {
getAllPosts() {
return posts;
}
getPostById(id: number) {
// posts(배열) find(배열에서 찾기)
// 만족하는 요소가 없으면 undefined
const post = posts.find((post) => post.id === +id);
if (!post) throw new NotFoundException();
return post;
}
createPost(author: string, title: string, content: string) {
// 객체 생성
const post: PostModel = {
id: posts[posts.length - 1].id + 1,
author,
title,
content,
likeCount: 0,
commentCount: 0,
};
// 생성된 객체 뒤에 추가
posts = [
...posts,
post,
]
return post;
}
updatePost(postId: number, author: string, title: string, content: string) {
const post = posts.find((post) => post.id === postId);
if (!post) throw new NotFoundException();
if (author) post.author = author;
if (title) post.title = title;
if (content) post.content = content;
// map
posts = posts.map(prevPost => prevPost.id === +post ? post : prevPost);
return post;
}
deletePost(postId: number) {
// filter는 post.id와 postId가 일치하지 않는 새로운 배열을 생성
posts = posts.filter(post => post.id !== postId);
return postId;
}
}
import { TypeOrmModule } from '@nestjs/typeorm';
import { Module } from '@nestjs/common';
import { PostsService } from './posts.service';
import { PostsController } from './posts.controller';
import { PostsModel } from './entities/posts.entity';
@Module({
controllers: [PostsController],
providers: [PostsService],
})
export class PostsModule {}
그리고 export 된 PostsModule을 app.module.ts에 등록해야한다. 왜냐하면 등록되지 않으면 AppModule class를 실행할 때 알아차릴 수 없기 때문이다.
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { PostsModule } from './posts/posts.module';
@Module({
imports: [PostsModule], // imports
controllers: [AppController],
providers: [AppService],
})
export class AppModule {}
main.ts로 가면 AppModule가 있다.
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
async function bootstrap() {
const app = await NestFactory.create(AppModule); // 여기
await app.listen(3000);
}
bootstrap();
실행이 되면 NestFactory는 AppModule로가서 imports된 Module를 찾고 IoC에 넣는다. 그리고 DI를 해주는 방식이다.