Skip to content

Commit

Permalink
feat: attach user to academic notice
Browse files Browse the repository at this point in the history
  • Loading branch information
2paperstar committed Nov 23, 2023
1 parent 592aca5 commit 52bb811
Show file tree
Hide file tree
Showing 4 changed files with 35 additions and 13 deletions.
1 change: 1 addition & 0 deletions src/notice/notice.module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ import { NoticeService } from './notice.service';
PrismaModule,
HttpModule,
TagModule,
UserModule,
],
controllers: [NoticeController],
providers: [NoticeService, NoticeRepository],
Expand Down
18 changes: 11 additions & 7 deletions src/notice/notice.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,17 +7,18 @@ import dayjs from 'dayjs';
import { htmlToText } from 'html-to-text';
import {
catchError,
filter,
firstValueFrom,
from,
map,
takeWhile,
throwError,
timeout,
toArray,
} from 'rxjs';
import { FcmService } from 'src/global/service/fcm.service';
import { ImageService } from 'src/image/image.service';
import { TagService } from 'src/tag/tag.service';
import { UserService } from 'src/user/user.service';
import { AdditionalNoticeDto } from './dto/additionalNotice.dto';
import { CreateNoticeDto } from './dto/createNotice.dto';
import { ForeignContentDto } from './dto/foreignContent.dto';
Expand All @@ -33,9 +34,9 @@ export class NoticeService {
private readonly fcmService: FcmService,
private readonly httpService: HttpService,
private readonly tagService: TagService,
private readonly userService: UserService,
configService: ConfigService,
) {
this.crawlAcademicNotice();
this.s3Url = `https://s3.${configService.get<string>(
'AWS_S3_REGION',
)}.amazonaws.com/${configService.get<string>('AWS_S3_BUCKET_NAME')}/`;
Expand Down Expand Up @@ -213,6 +214,7 @@ export class NoticeService {
private async getAcademicNoticeList() {
const baseUrl = 'https://www.gist.ac.kr/kr/html/sub05/050209.html';
const stream = this.httpService.get(baseUrl).pipe(
timeout(10000),
map((res) => res.data),
map((e) => cheerio.load(e)),
catchError(throwError),
Expand All @@ -238,6 +240,7 @@ export class NoticeService {
private async getAcademicNotice(link: string) {
const baseUrl = 'https://www.gist.ac.kr/kr/html/sub05/050209.html';
const stream = this.httpService.get(link).pipe(
timeout(10000),
map((res) => res.data),
map((e) => cheerio.load(e)),
catchError(throwError),
Expand All @@ -260,24 +263,22 @@ export class NoticeService {
return { files, content };
}

// @Cron('*/30 * * * * *')
@Cron('30 * * * * *')
async crawlAcademicNotice() {
const notices = await this.getAcademicNoticeList();
const recentNotice = await this.noticeRepository.getNoticeList({
limit: 1,
orderBy: 'recent',
tags: ['academic'],
});
from(notices).pipe(
filter((n) => n.title === recentNotice[0].contents[0].title),
);
const noticesToCreate$ = from(notices).pipe(
takeWhile((n) => n.title !== recentNotice[0].contents[0].title),
toArray(),
map((n) => n.reverse()),
);
const noticesToCreate = await firstValueFrom(noticesToCreate$);
for (const noticeMetadata of noticesToCreate) {
console.log(noticeMetadata.title);
const notice = await this.getAcademicNotice(noticeMetadata.link);
const filesList = notice.files
.map((file) => `<li><a href="${file.href}">${file.name}</a></li>`)
Expand All @@ -288,14 +289,17 @@ export class NoticeService {
'academic',
noticeMetadata.category,
]);
const user = await this.userService.addTempUser(
`${noticeMetadata.author} (${noticeMetadata.category})`,
);
await this.noticeRepository.createNotice(
{
title: noticeMetadata.title,
body,
images: [],
tags: tags.map(({ id }) => id),
},
'1',
user.uuid,
);
}
}
Expand Down
12 changes: 6 additions & 6 deletions src/user/user.module.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
import { Module } from '@nestjs/common';
import { UserController } from './user.controller';
import { UserService } from './user.service';
import { HttpModule } from '@nestjs/axios';
import { Module } from '@nestjs/common';
import { PrismaModule } from 'src/prisma/prisma.module';
import { AnonymousStrategy } from './guard/anonymous.strategy';
import { IdPGuard } from './guard/idp.guard';
import { IdPStrategy } from './guard/idp.strategy';
import { AnonymousStrategy } from './guard/anonymous.strategy';
import { IdpOptionalStrategy } from './guard/idpOptional.strategy';
import { PrismaModule } from 'src/prisma/prisma.module';
import { UserController } from './user.controller';
import { UserService } from './user.service';

@Module({
imports: [HttpModule, PrismaModule],
Expand All @@ -18,6 +18,6 @@ import { PrismaModule } from 'src/prisma/prisma.module';
AnonymousStrategy,
],
controllers: [UserController],
exports: [IdPGuard],
exports: [IdPGuard, UserService],
})
export class UserModule {}
17 changes: 17 additions & 0 deletions src/user/user.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import {
import { ConfigService } from '@nestjs/config';
import { User } from '@prisma/client';
import { AxiosError } from 'axios';
import crypto from 'crypto';
import { catchError, firstValueFrom } from 'rxjs';
import { PrismaService } from 'src/prisma/prisma.service';
import { LoginDto } from './dto/login.dto';
Expand Down Expand Up @@ -206,4 +207,20 @@ export class UserService {
},
});
}

async addTempUser(name: string) {
const user = await this.prismaService.user.findFirst({
where: { name },
});
if (user) {
return user;
}
return this.prismaService.user.create({
data: {
uuid: crypto.randomUUID(),
name,
consent: false,
},
});
}
}

0 comments on commit 52bb811

Please sign in to comment.