Skip to content

Commit

Permalink
Merge pull request #218 from boostcampwm-2024/back/main
Browse files Browse the repository at this point in the history
[BE] 브랜치 병합
  • Loading branch information
uuuo3o authored Nov 27, 2024
2 parents d018fce + 25db064 commit 7781b9b
Show file tree
Hide file tree
Showing 9 changed files with 218 additions and 154 deletions.
7 changes: 6 additions & 1 deletion BE/src/asset/asset.repository.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,11 @@ export class AssetRepository extends Repository<Asset> {
.getRawMany();
}

async findAllPendingOrders(userId: number, tradeType: TradeType) {
async findAllPendingOrders(
userId: number,
tradeType: TradeType,
stockCode?: string,
) {
const queryRunner = this.dataSource.createQueryRunner();
await queryRunner.startTransaction();

Expand All @@ -29,6 +33,7 @@ export class AssetRepository extends Repository<Asset> {
user_id: userId,
status: StatusType.PENDING,
trade_type: tradeType,
...(stockCode ? { stock_code: stockCode } : {}),
},
});

Expand Down
1 change: 1 addition & 0 deletions BE/src/asset/asset.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ export class AssetService {
const pendingOrders = await this.assetRepository.findAllPendingOrders(
userId,
TradeType.SELL,
stockCode,
);
const totalPendingCount = pendingOrders.reduce(
(sum, pendingOrder) => sum + pendingOrder.amount,
Expand Down
2 changes: 1 addition & 1 deletion BE/src/news/dto/news-data-output.dto.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,5 @@ export class NewsDataOutputDto {
originallink: string;
link: string;
description: string;
pubDate: string;
pubDate: Date;
}
18 changes: 18 additions & 0 deletions BE/src/news/dto/news-item-data.dto.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import { ApiProperty } from '@nestjs/swagger';

export class NewsItemDataDto {
@ApiProperty({ description: '뉴스 기사 제목' })
title: string;

@ApiProperty({ description: '원문 URL' })
originallink: string;

@ApiProperty({ description: '뉴스 기사의 내용을 요약한 패시지 정보' })
description: string;

@ApiProperty({ description: '기사 원문이 제공된 시간' })
pubDate: Date;

@ApiProperty({ description: '검색 키워드' })
query: string;
}
18 changes: 5 additions & 13 deletions BE/src/news/dto/news-response.dto.ts
Original file line number Diff line number Diff line change
@@ -1,18 +1,10 @@
import { ApiProperty } from '@nestjs/swagger';
import { NewsItemDataDto } from './news-item-data.dto';

export class NewsResponseDto {
@ApiProperty({ description: '뉴스 기사 제목' })
title: string;
@ApiProperty({ description: '마지막 업데이트 시간' })
updatedAt: Date;

@ApiProperty({ description: '원문 URL' })
originallink: string;

@ApiProperty({ description: '뉴스 기사의 내용을 요약한 패시지 정보' })
description: string;

@ApiProperty({ description: '기사 원문이 제공된 시간' })
pubDate: string;

@ApiProperty({ description: '검색 키워드' })
query: string;
@ApiProperty({ description: '뉴스 목록', type: [NewsItemDataDto] })
news: NewsItemDataDto[];
}
4 changes: 2 additions & 2 deletions BE/src/news/news.controller.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { Controller, Get } from '@nestjs/common';
import { ApiResponse, ApiTags } from '@nestjs/swagger';
import { NewsService } from './news.service';
import { NewsDatabaseResponseDto } from './dto/news-database-response.dto';
import { NewsResponseDto } from './dto/news-response.dto';

@ApiTags('뉴스 API')
@Controller('/api/news')
Expand All @@ -12,7 +12,7 @@ export class NewsController {
@ApiResponse({
status: 200,
description: '뉴스 조회 성공',
type: [NewsDatabaseResponseDto],
type: [NewsResponseDto],
})
async getNews() {
return this.newsService.getNews();
Expand Down
47 changes: 41 additions & 6 deletions BE/src/news/news.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,10 @@ import { In } from 'typeorm';
import { NaverApiDomianService } from './naver-api-domian.service';
import { NewsApiResponse } from './interface/news-value.interface';
import { NewsDataOutputDto } from './dto/news-data-output.dto';
import { NewsItemDataDto } from './dto/news-item-data.dto';
import { NewsResponseDto } from './dto/news-response.dto';
import { NewsRepository } from './news.repository';
import { News } from './news.entity';

@Injectable()
export class NewsService {
Expand All @@ -14,11 +16,37 @@ export class NewsService {
private readonly newsRepository: NewsRepository,
) {}

async getNews() {
return this.newsRepository.find();
async getNews(): Promise<NewsResponseDto> {
const dbData: News[] = await this.newsRepository.find({
select: {
title: true,
description: true,
pubDate: true,
originallink: true,
query: true,
updatedAt: true,
},
order: { pubDate: 'DESC' },
});

const updateTime = dbData[0].updatedAt;
const formattedNewsData = dbData.map(
({ title, description, pubDate, originallink, query }) => ({
title,
description,
pubDate,
originallink,
query,
}),
);

return {
updatedAt: updateTime,
news: formattedNewsData,
};
}

@Cron('*/30 8-16 * * 1-5')
@Cron('*/1 8-16 * * 1-5')
async cronNewsData() {
await this.newsRepository.delete({ query: In(['증권', '주식']) });
await this.getNewsDataByQuery('주식');
Expand Down Expand Up @@ -46,15 +74,22 @@ export class NewsService {

private formatNewsData(query: string, items: NewsDataOutputDto[]) {
return items.slice(0, 10).map((item) => {
const result = new NewsResponseDto();
const result = new NewsItemDataDto();

result.title = item.title.replace(/<\/?b>/g, '');
result.description = item.description.replace(/<\/?b>/g, '');
result.title = this.htmlEncode(item.title);
result.description = this.htmlEncode(item.description);
result.originallink = item.originallink;
result.pubDate = item.pubDate;
result.query = query;

return result;
});
}

private htmlEncode(value: string) {
return value
.replace(/<\/?b>/g, '')
.replace(/&quot;/g, '"')
.replace(/&amp;/g, '&');
}
}
Loading

0 comments on commit 7781b9b

Please sign in to comment.