Skip to content

Commit b2e648b

Browse files
committed
[#18] 게시판 스크랩 기능
1 parent 84f6f40 commit b2e648b

File tree

10 files changed

+164
-5
lines changed

10 files changed

+164
-5
lines changed

src/app.module.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import { AuthModule } from './auth/auth.module';
88
import { ormConfig } from 'orm.config';
99
import { KakaoMapModule } from './kakaomap/map.module';
1010
import { BoardsModule } from './boards/boards.module';
11+
import { ScrapModule } from './scrap/scrap.module';
1112

1213
@Module({
1314
imports: [
@@ -27,7 +28,8 @@ import { BoardsModule } from './boards/boards.module';
2728
UsersModule,
2829
AuthModule,
2930
KakaoMapModule,
30-
BoardsModule
31+
BoardsModule,
32+
ScrapModule
3133
],
3234
controllers: [AppController],
3335
providers: [AppService]

src/boards/boards.module.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,10 @@ import { TypeOrmModule } from '@nestjs/typeorm';
55
import { BoardsEntity } from './entities/boards.entity';
66

77
@Module({
8-
imports: [TypeOrmModule.forFeature([BoardsEntity])],
8+
imports: [
9+
TypeOrmModule.forFeature([BoardsEntity]),
10+
BoardsModule],
11+
exports: [BoardsService],
912
controllers: [BoardsController],
1013
providers: [BoardsService]
1114
})

src/boards/entities/boards.entity.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
import { Entity, Column, PrimaryGeneratedColumn, CreateDateColumn, UpdateDateColumn, DeleteDateColumn } from "typeorm";
1+
import { Entity, Column, PrimaryGeneratedColumn, CreateDateColumn, UpdateDateColumn, DeleteDateColumn, OneToMany } from "typeorm";
2+
import { ScrapEntity } from "src/scrap/scrap.entity";
23

34
@Entity('boards')
45
export class BoardsEntity {
@@ -20,6 +21,9 @@ export class BoardsEntity {
2021
@DeleteDateColumn()
2122
deletedAt: Date;
2223

24+
@OneToMany(() => ScrapEntity, scrap => scrap.board)
25+
bridges: ScrapEntity[];
26+
2327
public static validate(title: string, contents: string): boolean {
2428
const isTitleValid = title;
2529
const isContentsValid = contents;

src/scrap/scrap.controller.spec.ts

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import { Test, TestingModule } from '@nestjs/testing';
2+
import { ScrapController } from './scrap.controller';
3+
4+
describe('ScrapController', () => {
5+
let controller: ScrapController;
6+
7+
beforeEach(async () => {
8+
const module: TestingModule = await Test.createTestingModule({
9+
controllers: [ScrapController],
10+
}).compile();
11+
12+
controller = module.get<ScrapController>(ScrapController);
13+
});
14+
15+
it('should be defined', () => {
16+
expect(controller).toBeDefined();
17+
});
18+
});

src/scrap/scrap.controller.ts

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import { Controller, Post, UseGuards, Param, ParseIntPipe, Delete } from '@nestjs/common';
2+
import { ScrapService } from './scrap.service';
3+
import { ScrapEntity } from './scrap.entity';
4+
import { User } from 'src/users/user.decorator';
5+
import { UserEntity } from 'src/users/entities/user.entity';
6+
import { JwtAuthGuard } from 'src/auth/security/passport.jwt';
7+
8+
@Controller('scrap')
9+
export class ScrapController {
10+
constructor(private readonly scrapService: ScrapService) { }
11+
12+
@UseGuards(JwtAuthGuard)
13+
@Post(':boardId')
14+
async createScrap(@User() user: UserEntity,
15+
@Param('boardId', ParseIntPipe) boardId: number) {
16+
return this.scrapService.createScrap(user, boardId);
17+
}
18+
19+
@Delete(':boardId')
20+
async deleteScrap(@User() user: UserEntity,
21+
@Param('boardId', ParseIntPipe) boardId: number) {
22+
return this.scrapService.deleteScrap(user, boardId);
23+
}
24+
}

src/scrap/scrap.entity.ts

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import { Entity, PrimaryColumn, ManyToOne, CreateDateColumn, JoinColumn } from "typeorm";
2+
import { UserEntity } from "src/users/entities/user.entity";
3+
import { BoardsEntity } from "src/boards/entities/boards.entity";
4+
5+
@Entity('scrap')
6+
export class ScrapEntity {
7+
@PrimaryColumn()
8+
userNo: number;
9+
10+
@PrimaryColumn()
11+
boardId: number;
12+
13+
@CreateDateColumn()
14+
createdAt: Date;
15+
16+
@ManyToOne(() => UserEntity, (user) => user.bridges)
17+
@JoinColumn({ name: 'userNo', referencedColumnName: 'userNo' })
18+
user: UserEntity;
19+
20+
@ManyToOne(() => BoardsEntity, (board) => board.bridges)
21+
@JoinColumn({ name: 'boardId', referencedColumnName: 'boardId' })
22+
board: BoardsEntity;
23+
}

src/scrap/scrap.module.ts

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import { Module } from '@nestjs/common';
2+
import { ScrapController } from './scrap.controller';
3+
import { ScrapService } from './scrap.service';
4+
import { UsersModule } from 'src/users/users.module';
5+
import { BoardsModule } from 'src/boards/boards.module';
6+
import { TypeOrmModule } from '@nestjs/typeorm';
7+
import { ScrapEntity } from './scrap.entity';
8+
9+
@Module({
10+
imports: [
11+
TypeOrmModule.forFeature([ScrapEntity]),
12+
UsersModule,
13+
BoardsModule],
14+
controllers: [ScrapController],
15+
providers: [ScrapService]
16+
})
17+
export class ScrapModule { }

src/scrap/scrap.service.spec.ts

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import { Test, TestingModule } from '@nestjs/testing';
2+
import { ScrapService } from './scrap.service';
3+
4+
describe('ScrapService', () => {
5+
let service: ScrapService;
6+
7+
beforeEach(async () => {
8+
const module: TestingModule = await Test.createTestingModule({
9+
providers: [ScrapService],
10+
}).compile();
11+
12+
service = module.get<ScrapService>(ScrapService);
13+
});
14+
15+
it('should be defined', () => {
16+
expect(service).toBeDefined();
17+
});
18+
});

src/scrap/scrap.service.ts

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
import { Injectable } from '@nestjs/common';
2+
import { ScrapEntity } from './scrap.entity';
3+
import { UsersService } from 'src/users/users.service';
4+
import { BoardsService } from 'src/boards/boards.service';
5+
import { DataSource, Repository } from 'typeorm';
6+
import { UserEntity } from 'src/users/entities/user.entity';
7+
import { BoardsEntity } from 'src/boards/entities/boards.entity';
8+
import { InjectRepository } from '@nestjs/typeorm';
9+
10+
@Injectable()
11+
export class ScrapService {
12+
constructor(private readonly dataSource: DataSource,
13+
@InjectRepository(ScrapEntity)
14+
private scrapRepository: Repository<ScrapEntity>) { }
15+
16+
async createScrap(user, postId) {
17+
const userNo = user.payload.userNo;
18+
const userForSave = new UserEntity;
19+
userForSave.userNo = userNo;
20+
21+
await this.dataSource.manager.save(userForSave);
22+
23+
const board = new BoardsEntity;
24+
board.boardId = postId;
25+
26+
await this.dataSource.manager.save(board);
27+
28+
const scrap = new ScrapEntity;
29+
scrap.userNo = userNo;
30+
scrap.boardId = postId;
31+
32+
await this.dataSource.manager.save(scrap);
33+
34+
return '스크랩 되었습니다.';
35+
}
36+
37+
async deleteScrap(user, boardId) {
38+
const scrap = new ScrapEntity;
39+
scrap.userNo = user.payload.userNo;
40+
scrap.boardId = boardId;
41+
42+
await this.scrapRepository.remove(scrap);
43+
}
44+
45+
//TODO scrap read
46+
}

src/users/entities/user.entity.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1-
import { PrimaryGeneratedColumn, Column, BeforeInsert, Entity} from 'typeorm';
1+
import { PrimaryGeneratedColumn, Column, BeforeInsert, Entity, OneToMany } from 'typeorm';
22
import * as bcrypt from 'bcrypt';
3+
import { ScrapEntity } from 'src/scrap/scrap.entity';
34

45
@Entity('tb_user')
56
export class UserEntity {
@@ -19,8 +20,11 @@ export class UserEntity {
1920
password: string;
2021

2122
@BeforeInsert()
22-
private beforeInsert(){
23+
private beforeInsert() {
2324
this.password = bcrypt.hashSync(this.password, 5);
2425
}
2526

27+
@OneToMany(() => ScrapEntity, scrap => scrap.user)
28+
bridges: ScrapEntity[];
29+
2630
}

0 commit comments

Comments
 (0)